403 Forbidden是服务器找到资源但拒绝访问,非“找不到”而是“不让你看”。排查须按错误日志→用户权限→配置逻辑→SELinux/ AppArmor四层顺序验证,首查/var/log/nginx/error.log中(13: Permission denied)等关键报错。

403 Forbidden 不是“找不到文件”,而是“找到了但不给看”。Nginx 工作进程(如 nginx 或 www-data)没有权限读取目标路径或文件,就会返回这个错误。排查要按线索层层推进,不能跳步。
看错误日志,锁定具体失败点
这是最直接有效的第一步。运行:
sudo tail -n 50 /var/log/nginx/error.log重点找含 (13: Permission denied) 的行,例如:
open() "/data/www/index.html" failed (13: Permission denied)这说明 Nginx 尝试打开该路径时被系统拒绝,问题一定出在文件权限、SELinux 或路径可执行性上。
检查 Nginx 工作用户与目录权限是否匹配
Nginx 主进程可能用 root 启动,但真正处理请求的是 worker 进程,它们以配置中 user 指令指定的用户运行(默认常为 nginx 或 www-data)。
- 查当前工作用户:ps aux | grep "nginx: worker process"
- 查网站根目录权限:ls -ld /your/web/root
- 确保该用户对整个路径链(如 /data → /data/www)都有 x(执行)权限——这是进入目录的前提
- 确保目标文件(如 index.html)有 r(读)权限
- 常见修复:sudo chown -R nginx:nginx /data/www 或 sudo chmod 755 /data/www 和 sudo chmod 644 /data/www/index.html
确认 index 文件存在且配置正确
访问 / 这类目录时,Nginx 会按 index 指令顺序查找默认文件:
- 检查配置里是否有类似 index index.html index.php;
- 确认这些文件真实存在于 root 指定的路径下(比如 root /data/www; 下必须有 /data/www/index.html)
- 如果只是临时测试,可在 location 块中加 autoindex on; 查看目录列表(生产环境禁用)
排查 SELinux 或 AppArmor 干预
尤其在 CentOS/RHEL 系统上,SELinux 默认启用,会拦截 Nginx 对非标准路径(如 /data/www)或自定义端口的访问。
- 查状态:sestatus(若为 enforcing,嫌疑很大)
- 临时验证:sudo setenforce 0,再刷新页面;若恢复,就是 SELinux 导致
- 长期解决不是关它,而是打标签:sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?",然后 sudo restorecon -Rv /data/www
- 若用了自定义端口(如 12000),还需添加端口类型:sudo semanage port -a -t http_port_t -p tcp 12000


















