nginx用alias报403/404主因是权限越界而非路径错误:需确认nginx工作用户(如www-data)、整条路径每级目录均具x权限、location与alias斜杠严格配对,并排除selinux/apparmor拦截及软链接逃逸风险。

Nginx 用 alias 指向绝对路径却报 403 或 404,多数不是路径写错,而是权限越界——即 Nginx 进程被系统权限机制拦在了目录门外。排查核心是确认“它能不能走到目标文件”,而不是“文件在不在”。
先查 Nginx 工作用户是谁
打开 /etc/nginx/nginx.conf,找 user 指令,例如:user www-data; 或 user nginx;
没配置时默认可能是 nobody 或 www-data。验证方式:
ps aux | grep nginx | grep -v grep | grep worker
看输出中 USER 列的值(通常是第二列)。
再验整条路径的执行权限(x)是否连通
Linux 中进入目录必须有 x 权限,缺一不可。比如配置:
location /media/ {
alias /mnt/nas/public/media/;
}
那么 /mnt、/mnt/nas、/mnt/nas/public、/mnt/nas/public/media 这四级目录,每一级都必须对 Nginx 用户(如 www-data)有 x 权限。
用 namei -l /mnt/nas/public/media/test.jpg 一次性列出整条路径的权限和属主,重点看每级的 x 是否对 group 或 other 开放。
检查 alias 路径末尾斜杠是否与 location 严格一致
这是越界类 404 的高发原因:
- ✅
location /media/ { alias /mnt/nas/public/media/; }→/media/logo.png→/mnt/nas/public/media/logo.png - ❌
location /media/ { alias /mnt/nas/public/media; }→/media/logo.png→/mnt/nas/public/mediaproduct/logo.png(自动粘连,越出预期目录)
斜杠不配对会导致路径计算偏移,看似在目标目录下,实则拼到了兄弟目录甚至父目录外。
确认是否被 SELinux 或 AppArmor 拦截
即使 ls -l 显示权限全开,某些系统仍会静默拦截:
- CentOS/RHEL 上运行:
ausearch -m avc -ts recent | grep nginx - Ubuntu 上检查:
sudo aa-status | grep nginx
若启用,需补上下文标签或策略:sudo chcon -Rt httpd_sys_content_t /mnt/nas/public/media/
用 sudo -u 模拟真实访问行为
别只看 ls -l,要让 Nginx 用户亲自试:
sudo -u www-data ls -l /mnt/nas/public/media/ sudo -u www-data head -c 20 /mnt/nas/public/media/logo.png 2>/dev/null
任一命令失败,就说明权限链断在某一级。
加 internal 或 disable_symlinks 主动设防
如果 alias 目录含敏感子路径(如 .git、config/),仅靠文件权限不够:
location /media/ {
alias /mnt/nas/public/media/;
disable_symlinks on from=/mnt/nas/public/media/;
location ~ /\. { deny all; }
}
disable_symlinks 可防止软链接逃逸到 /etc/passwd 等系统路径,from= 必须是绝对路径且与 alias 实际根一致。
不复杂但容易忽略:权限越界问题往往卡在父目录缺 x,或 disable_symlinks 没配 from=,或 SELinux 默默拒绝。三步到位——查用户、验路径、模拟访问。











