Nginx access.log 与 error.log 定位网站问题

介绍如何通过 Nginx 访问日志与错误日志定位线上问题,包括常见状态码与错误码含义、日志字段自定义、快速筛选命令,以及针对 502、404、慢请求的排查路径。

两类日志各看什么

access.log 记录每一次请求的来源、路径、状态码、耗时与响应大小,回答「谁在访问、访问了什么、结果如何」;error.log 记录处理过程中的异常,回答「为什么失败」。排查线上问题通常先看 access 找到异常请求,再看 error 确认原因,两者配合才能定位。

access.log 关键字段

默认 combined 格式包含:客户端 IP、时间、请求行、状态码、Referer、User-Agent。建议额外加入 $request_time 与 $upstream_response_time 两个字段,前者是总耗时,后者是后端耗时——两者差值大说明耗在网络或 Nginx 自身,接近则说明瓶颈在后端。加上这两个字段后,慢请求排查会直接很多。

常见状态码与处理

状态码 含义 排查方向
200/304 正常 / 协商缓存命中 无需处理
301/302 跳转 确认跳转目标正确,避免循环
403 拒绝访问 目录权限、规则拦截、防盗链
404 未找到 链接错误、重写规则、资源被删
499 客户端提前断开 后端太慢或请求超时
500 后端内部错误 看 PHP/应用日志
502/504 网关错误 / 超时 后端进程崩溃或响应超时

error.log 高频错误

  • connect() failed (111: Connection refused):后端端口没监听,检查 PHP-FPM 是否存活
  • upstream timed out:后端处理过慢,优化脚本或调大超时
  • no live upstreams:后端全部不可用,检查 upstream 健康状态
  • SSL certificate verify failed:证书链不完整或过期
  • directory index forbidden:缺少索引文件且不允许目录浏览

快速筛选命令

按状态码筛出 5xx:在日志中过滤对应的三位状态码字段;按耗时找慢请求:用 awk 按耗时字段排序取前 20;统计某路径的访问量:按请求行聚合计数;定位异常 IP:按来源 IP 汇总看是否存在异常高频访问。这些命令配合 grep 与 awk 使用,比打开日志文件翻页高效得多。

建立排查习惯

  1. 确认问题范围:单页、单接口还是全站
  2. 看 access:状态码分布是否异常、耗时是否上升
  3. 看 error:对应时间点的错误记录
  4. 看后端:PHP-FPM、数据库、磁盘 IO
  5. 修复后持续观察日志,确认恢复

日志的价值在于「事先就开着」。很多站点出问题后才发现 access.log 被关或没配置耗时字段,临时开启又需要重启、错过现场。把耗时字段与日志轮转在建站时就配好,是运维成本最低的保险。

Previous Article

PHP-FPM 内存与进程模型优化(OOM 排查)

Next Article

WordPress 数据库优化:修订版本、草稿与垃圾评论清理

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *