核心是精准定位耗时环节:需用含$request_time和$upstream_response_time等字段的自定义日志格式,通过awk命令筛选超时请求、统计异常后端、比对时间差值,并依三类典型慢因(后端服务慢、网络/连接问题、nginx或客户端侧慢)归因验证。

分析 Nginx 的慢日志,核心是“精准定位耗时环节 + 快速归因 + 有针对性优化”。它不是简单地找 $request_time 大的行,而是要拆解时间分布、区分责任边界(Nginx 自身、网络、后端服务、客户端),再结合上下文判断问题根源。
一、确认日志格式是否支持深度分析
默认的 combined 格式不记录响应时间字段,无法分析慢请求。必须使用含 $request_time 和上游时间字段的日志格式:
- 至少包含:
$request_time(整个请求处理总时间)、$upstream_response_time(后端响应耗时) - 强烈建议补充:
$upstream_connect_time(建连耗时)、$upstream_header_time(后端返回 header 耗时)、$upstream_addr(具体后端地址) - 示例配置:
log_format slowlog '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $upstream_connect_time $upstream_addr';
然后在access_log指令中引用该格式,并指向独立文件(如/var/log/nginx/slow.log)
二、用命令行快速筛选与归类
无需导入大系统,一条命令就能抓住关键线索:
- 查所有超过 1 秒的请求:
awk '$NF > 1' /var/log/nginx/slow.log(假设$request_time是最后一列) - 看哪些后端最拖后腿:
awk '$8 > 1 {print $9}' /var/log/nginx/slow.log | sort | uniq -c | sort -nr(提取超时请求中的$upstream_addr并统计频次) - 对比总时间和后端时间差异:若
$request_time明显大于$upstream_response_time,说明瓶颈可能在 Nginx 本身(如大文件传输、gzip 压缩、SSL 握手)或客户端网络
三、区分三类典型慢因并验证
根据日志字段组合,能快速缩小排查范围:
-
后端服务慢:表现为
$upstream_response_time高,且与$request_time接近 → 直接检查对应应用日志、数据库慢查询、CPU/内存负载 -
网络或连接问题:表现为
$upstream_connect_time高(>500ms),而$upstream_response_time正常 → 检查后端服务是否过载、网络丢包、DNS 解析延迟、连接池是否耗尽 -
Nginx 或客户端侧慢:表现为
$request_time高但$upstream_response_time很低(如 client_max_body_size 导致上传卡顿)、SSL 协商、客户端弱网、或响应体过大未启用压缩
四、进阶:用工具提升效率
日常排查可依赖轻量工具,避免重复写脚本:
- GoAccess:支持自定义日志格式,生成 HTML 报告,直观查看“Top URLs by Avg. Time”、“Response Time Distribution”图表
- red 工具:终端内实时解析 + 趋势图 + 智能聚合(如自动合并相似 URL),适合现场快速扫描
-
ELK Stack:适合长期监控,可对
request_time做直方图、按upstream_addr分组聚合、设置 P95/P99 告警阈值











