直接查看 error.log 报错信息可定位问题层级:重点分析错误描述原文、client/server 标识、request 请求上下文;用 tail -f 实时监控日志;用 namei 检查路径权限断点;区分 nginx 自身拒绝还是后端返回 403。

直接看 error.log 里的具体报错信息,它几乎总能告诉你问题出在哪一层。
重点抓日志里的三类关键线索
错误描述原文:比如 directory index of "/var/www/app/" is forbidden,说明 Nginx 找到了目录但没找到索引文件,也没开目录浏览;又比如 open() "/var/www/html/index.html" failed (13: Permission denied),括号里 (13: Permission denied) 是 Linux 系统错误码,明确指向权限不足,不是配置或路径问题。
客户端与服务端标识:记录里的 client: 192.168.1.105 和 server: example.com 能帮你判断是全站报错,还是仅某个 IP 或某个域名下的虚拟主机异常。如果只有特定 client 出现 403,要怀疑是不是 IP 限制、Referer 校验或后端鉴权拦截了它。
请求上下文:request: "GET / HTTP/1.1" 告诉你访问的是根路径,host: "example.com" 确认匹配的是哪个 server 块。如果 request 是 GET /api/v1/data 却返回 403,大概率不是静态文件权限问题,而是 location 匹配进了带 deny 规则的区块,或是代理到后端时被拒绝。
用 tail -f 实时盯住日志变化
在复现问题的同时运行:sudo tail -f /var/log/nginx/error.log
这样你每刷新一次页面,就能立刻看到对应哪一行新日志产生,避免翻找和时间错位。如果日志没更新,说明请求根本没进 Nginx(可能卡在 CDN、防火墙或 DNS),或者 Nginx 没监听对端口。
结合 namei 查路径权限断点
当报错含 Permission denied,别只查目标文件权限。Linux 要求从根目录开始,每一级父目录都得有 x(执行)权限,Nginx 才能“进入”该目录。用这个命令一次性看清整条路径的权限和属主:namei -l /var/www/html/index.html
输出类似:
- dr-xr-xr-x root root /
- drwxr-xr-x root root /var
- drwxr-x--- nginx nginx /var/www
- drwxr-xr-x nginx nginx /var/www/html
- -rw-r--r-- nginx nginx /var/www/html/index.html
注意第三行:/var/www 的权限是 drwxr-x---,其他用户(others)没有 x 权限,而 Nginx 进程若以非 nginx 用户运行,就无法进入该目录——这就是典型的权限断点。
区分是 Nginx 拒绝还是后端拒绝
如果 Nginx 在做反向代理,日志里出现 403,不一定代表 Nginx 本身拦住了请求。先确认:
- 直接 curl 后端地址(如 curl http://127.0.0.1:8080/api/test)是否也返回 403;
- 检查 Nginx 配置中 proxy_pass 是否写错路径,或 proxy_set_header Host 是否传了错误域名导致后端白名单不通过;
- 看日志里有没有 upstream sent too big header 或 upstream prematurely closed connection 类提示,这类往往掩盖了后端真实返回的 403。











