精准定位后端瓶颈应使用$upstream_response_time而非$request_time;二者差值大说明问题在Nginx或链路层,差值小且均偏高则指向后端业务慢查询、阻塞或资源争用。

直接看 access.log 里的耗时字段,比盲猜或堆硬件更准、更快。
盯住两个关键时间字段
Nginx 默认日志格式中,$request_time 和 $upstream_response_time 是判断瓶颈位置的核心依据:
-
$request_time:从收到客户端第一个字节,到发完响应最后一个字节的总耗时(含 Nginx 自身处理、网络传输、后端响应全部环节) -
$upstream_response_time:Nginx 与后端服务(如 PHP-FPM、Java 应用)之间通信的实际耗时(建立连接 + 发请求 + 收响应 + 关闭连接)
两者差值明显偏大(比如 request_time=1.8s,upstream_response_time=0.02s),说明慢在 Nginx 层或客户端网络;若两者接近(比如都 ≈1.7s),问题大概率出在后端服务本身。
按百分位聚焦真实慢请求
平均响应时间容易被大量快请求“拉低”,掩盖退化。应重点看第 90 或第 95 百分位(P90/P95):
- 用工具(如 awk + sort + head)或日志分析平台提取某接口的
request_time列,排序后取前 5% 的值 - 对比基线期(如 7 天前)同一时段的 P95 值:若上升 30% 且持续数小时,属于典型性能退化信号
- 特别关注
status=200但request_time > 2s的请求,排除错误码干扰
结合 URL 和状态码交叉定位
单纯看耗时不够,要绑定业务上下文:
- 筛选出耗时 Top 10 的
url路径,看是否集中在某个接口(如/api/report/export)、某个资源类型(如大图加载/static/img/xxx.jpg) - 检查高耗时请求是否伴随异常
status(如 502/504 表示上游超时,499 表示客户端主动断连) - 留意
referrer字段:如果慢请求大多来自某第三方嵌入页,可能是跨域资源加载拖累整体体验
注意日志自身带来的干扰
日志写入本身可能成为性能瓶颈,尤其在高并发下:
- Traefik 等代理在极端压力下,
accesslog写入卡顿会导致Duration和Overhead计算失真,表现为随机出现一批 1s+ 的“假慢请求” - Nginx 若开启
buffered_logs或使用异步日志模块(如ngx_http_log_module配合 syslog),可降低对主线程影响 - 确认日志落盘方式:是写本地磁盘(易 IO 瓶颈)还是发远程日志服务(网络延迟引入误差)


















