403错误主因是nginx worker进程无权遍历路径各级目录,需逐级检查父目录执行权限(x)、确认真实运行用户、校准属主与selinux策略,并确保index文件存在且命名匹配。

看到 Nginx 返回 403 或日志里出现 (13: Permission denied),基本就是目录或文件权限没配对——不是“文件不能读”,而是“连门都进不去”。关键不在目标文件本身,而在它前面所有父目录是否允许 Nginx 进程进入。
先确认 Nginx 实际跑在哪个用户下
别只看配置文件里的 user 行,它可能被覆盖或压根没生效:
- 运行
ps aux | grep nginx,找到 worker 进程那一行,第二列就是真实用户(比如www-data或nginx) - 再核对
grep "user " /etc/nginx/nginx.conf,看配置是否一致;如果没这行,默认用户因系统而异(Ubuntu/Debian 通常是www-data,CentOS/RHEL 多为nginx)
逐级检查路径的执行权限(最容易漏的环节)
Linux 要访问 /var/www/html/index.html,Nginx 用户必须对 /、/var、/var/www、/var/www/html 每一级都有 x(执行)权限。缺任意一级,就卡住,报 403。
- 用
namei -l /var/www/html/index.html一次性列出所有层级的属主、属组和权限,一眼看出哪一级缺x - 常见问题:根目录下
/var或/var/www是 root 创建的,权限是750,而 Nginx 用户不在属组里 → 直接进不去 - 修复示例:
sudo chmod 755 /var/www /var/www/html(开放其他用户的读+执行),或更稳妥地:sudo chown -R www-data:www-data /var/www/html
验证文件与目录本身的读写权限
目录要有 x(才能进),文件要有 r(才能读);日志目录还得有 w(才能写):
- 静态文件(如
.html、.css)建议644(rw-r--r--) - 目录统一设为
755(drwxr-xr-x),确保 Nginx 用户能进入并列出内容 - 日志目录(如
/var/log/nginx)需允许 Nginx 用户写入:sudo chown www-data:adm /var/log/nginx+sudo chmod 755 /var/log/nginx - PHP socket(如
/run/php/php8.2-fpm.sock)要检查属主和权限,常因与 Nginx 用户不一致导致连接失败
排除 SELinux 或 AppArmor 干扰
传统权限全对,还是报错?可能是安全模块在背后拦截:
- CentOS/RHEL 上运行
getenforce,若返回Enforcing,临时切到宽容模式测试:sudo setenforce 0 - Ubuntu/Debian 上查
aa-status,看是否有 nginx 相关 profile 在运行;临时禁用可验证是否是它导致 - 确认是安全模块问题后,不要长期关闭,应生成或调整对应策略(如用
chcon -R -t httpd_sys_content_t /var/www/html)
不复杂但容易忽略——真正卡住的往往不是最后一级目录,而是中间某层“看不见”的父目录缺了那个小小的 x 权限。











