两类日志各看什么
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 使用,比打开日志文件翻页高效得多。
建立排查习惯
- 确认问题范围:单页、单接口还是全站
- 看 access:状态码分布是否异常、耗时是否上升
- 看 error:对应时间点的错误记录
- 看后端:PHP-FPM、数据库、磁盘 IO
- 修复后持续观察日志,确认恢复
日志的价值在于「事先就开着」。很多站点出问题后才发现 access.log 被关或没配置耗时字段,临时开启又需要重启、错过现场。把耗时字段与日志轮转在建站时就配好,是运维成本最低的保险。