Nginx 错误日志定位

1. 先理解这件事

如果访问日志回答的是“请求发生了什么”,那么错误日志回答的是:

  • Nginx 自己在运行时遇到了什么问题

对新手来说,错误日志最重要的意义是:

  • 服务起不来时先看它
  • 配置不生效时先看它
  • 反向代理报错时先看它

对有经验的读者,更值得关注的是:

  • 错误等级是否设置合理
  • 日志是否能区分启动错误、配置错误和运行时错误
  • 如何从错误日志快速关联到访问日志和上游应用日志

2. 最小可用配置

error_log /var/log/nginx/error.log warn;
 
http {
    server {
        listen 80;
        server_name example.com;
 
        location /api/ {
            proxy_pass http://127.0.0.1:3000;
        }
    }
}

先记住:

  • error_log 第一个参数是日志文件路径
  • 第二个参数是记录级别

常见级别从低到高包括:

  • debug
  • info
  • notice
  • warn
  • error
  • crit
  • alert
  • emerg

生产环境通常从 warnerror 起步,排障时再临时提高详细度。

3. 常见报错类型怎么读

3.1 配置类错误

例如:

  • 配置文件语法错误
  • 指令写在错误作用域
  • 重复监听端口

这类问题通常在 nginx -t 时就能暴露。

3.2 文件与权限类错误

例如:

  • 证书文件找不到
  • 静态目录不存在
  • 日志目录不可写

这类问题的关键词通常会出现:

  • No such file or directory
  • Permission denied

3.3 代理与上游类错误

例如:

  • connect() failed
  • upstream timed out
  • no live upstreams

这类错误通常表示:

  • 上游服务没启动
  • 网络不通
  • 上游响应过慢
  • 上游节点已经全部不可用

4. 一条实用的定位主线

新手可以先按这个顺序查:

  1. 先执行 nginx -t,确认不是配置语法问题。
  2. 再看 error.log 里最新几行,抓最明确的报错关键词。
  3. 对照访问日志,确认请求是否真的到了 Nginx。
  4. 如果是代理问题,再去看上游服务日志和端口状态。

更进阶的做法是把问题分三层:

  • Nginx 自身配置层
  • Nginx 与上游的连接层
  • 上游应用自身处理层

这样可以避免把所有问题都误判成“Nginx 配错了”。

5. 常见场景示例

5.1 502 Bad Gateway

优先排查:

  • proxy_pass 地址是否正确
  • 上游服务是否在监听
  • 容器或主机之间网络是否可达

5.2 403 Forbidden

优先排查:

  • 文件目录权限
  • rootalias 路径是否指对
  • 是否被安全规则拒绝

5.3 404 Not Found

优先排查:

  • location 匹配是否符合预期
  • try_files 是否写对
  • 静态文件是否真的存在

6. 实践建议

  1. 配置变更前后都执行 nginx -t
  2. 错误日志级别默认不要长期开到 debug
  3. 排障时同时查看访问日志和错误日志,避免只看一边。
  4. 如果有反向代理链路,要同步对照上游应用日志。

7. 排查清单

  • 已确认错误日志路径和级别
  • 变更前后已执行 nginx -t
  • 已抓到最新错误关键词而不是只看状态码
  • 已结合访问日志确认请求到达情况
  • 已按“配置层 连接层 应用层”分层排查

8. 相关笔记