Nginx中root和alias的核心区别在于路径拼接机制:root将location完整URI追加到指定路径后,alias则用指定路径替换location匹配部分;二者对文件系统权限要求一致,均需worker用户对路径各级目录有x权限、目标文件有r权限。

关键不在 root 或 alias 指令本身,而在于 Nginx worker 进程用户(如 www-data 或 nginx)能否逐级进入路径、读取文件。指令只决定路径拼接方式,权限控制完全由 Linux 文件系统执行。
先确认 Nginx 实际运行用户
别只看 nginx.conf 里的 user 行——它可能被注释、被 include 覆盖或未生效:
- 查真实 worker 用户:ps -eo pid,user,comm,args | grep 'nginx: worker' | grep -v grep
- 查配置定义:grep "user" /etc/nginx/nginx.conf(注意检查所有被 include 的 conf 文件)
- 常见默认值:Ubuntu/Debian 是 www-data,CentOS/RHEL 是 nginx,未显式配置时可能是 nobody
root 和 alias 对路径权限的要求一致但易错点不同
无论用 root 还是 alias,Nginx 都需对「从 / 到目标文件的每一级父目录」拥有 x(执行)权限,否则直接卡住报 403;目标文件还需 r(读)权限。
- root /data/app/html; → 要求:/data、/data/app、/data/app/html 均有 x 权限;/data/app/html/index.html 有 r 权限
- location /static { alias /mnt/assets/; } → 要求:/mnt、/mnt/assets 均有 x 权限;/mnt/assets/style.css 有 r 权限
- 易错:alias 后路径末尾必须加 /(如 alias /mnt/assets/;),否则 Nginx 可能误拼路径导致 404 或权限误判
按最小权限原则设置属主与权限
不推荐 chmod 777 或 user root;优先让 Nginx 用户成为属组或属主:
-
推荐方式(属组+组权限):
sudo chown -R root:www-data /data/app/html
sudo chmod -R 755 /data/app/html(目录)
sudo find /data/app/html -type f -exec chmod 644 {} \;(文件) -
统一属主方式:
sudo chown -R www-data:www-data /mnt/assets
再设对应权限(同上) - 绝对禁止:把网站目录放在 /root 下——该目录默认仅 root 可进,www-data 连 /root 都无法遍历,必 403
验证权限是否真正生效
不要只看配置,要模拟 worker 用户行为:
- 测试能否进入目录:sudo -u www-data ls -l /mnt/assets/
- 测试能否读取文件:sudo -u www-data head -n1 /mnt/assets/logo.png 2>/dev/null || echo "fail"
- 查看 error_log(设为 info 级):若报 Permission denied 就是权限问题;报


















