403 forbidden 表示 nginx 找到了资源但拒绝提供,非“找不到”而是“不让你读”;排查须严格按错误日志→文件系统权限→nginx配置逻辑→selinux/apparmor四层顺序验证,首查/var/log/nginx/error.log中(13: permission denied)等关键报错。

403 Forbidden 表示 Nginx 找到了请求的资源,但因权限或配置限制拒绝提供——不是“找不到”,而是“不让你读”。排查要讲顺序,不能跳步。核心四层:错误日志 → 文件系统权限 → Nginx 配置逻辑 → SELinux/AppArmor 等安全模块。
先看 error.log,找带 (13: Permission denied) 的报错行
这是最直接的线索。运行:
- sudo tail -n 50 /var/log/nginx/error.log(或你配置中指定的 error_log 路径)
- 重点搜 (13: Permission denied),例如:
open() "/usr/share/nginx/html/js/app.js" failed (13: Permission denied) - 如果看到 search permissions are missing on a component of the path,说明某一级父目录缺 x(执行)权限,比如
/home/user或/var/www目录本身不可进入
检查路径上每一级目录的 x 权限和文件的 r 权限
Nginx 进程(如 www-data、nginx)必须对从根目录到目标文件的完整路径中每一级目录都有 x 权限,且对目标文件有 r 权限。常见卡点:
-
/var/www 权限是
750,而 Nginx 用户既不是属主也不在属组 → 缺 others 的 x 权限,加 chmod o+x /var/www 即可恢复 - 用实际工作用户模拟访问:
sudo -u www-data ls -ld /var/www /var/www/html /var/www/html/index.html
逐级确认是否能 进入(x) 和 读取(r) - 注意:目录必须有 x 才能 cd 进去、ls 列出内容;文件有 r 才能被 Nginx 读取并返回给浏览器
核对 Nginx 配置中的 root/alias 和 index 设置
即使权限全对,配置错也会表现为 403(本质是“路径指向空目录 + 无 index + 未开启 autoindex”):
- 确认 location 块中 root 路径是否真实存在,且末尾不带子目录名(如
root /data/web;,则/data/web/index.html对应/index.html) - 若用 alias,注意它会完全替换匹配路径(
location /static/ { alias /data/assets/; }→ 请求/static/logo.png实际读/data/assets/logo.png) - 检查 index 指令列出的文件(如
index index.html;)是否真实存在于 root 目录下;缺失且未配autoindex on;就会返回 403
验证 SELinux 或 AppArmor 是否拦截
尤其在 CentOS/RHEL、Fedora 或启用了安全模块的 Ubuntu 上:
- 运行 sestatus 查状态;若为 enforcing,临时切宽容模式测试:
sudo setenforce 0 → 刷新页面看 403 是否消失 - 若恢复,说明是 SELinux 上下文问题。不要关 SELinux,而是打标签:
sudo chcon -Rt httpd_sys_content_t /your/web/root - Docker 容器内也需注意:宿主机挂载目录的 UID 必须与容器内 Nginx 用户 UID 一致(如 UID 101),否则同样触发权限拒绝











