直接通过对比$request_time和$upstream_response_time可快速定位性能瓶颈:前者含客户端上传、Nginx处理及响应下发,后者仅含Nginx与后端通信耗时;差值大说明客户端或Nginx下发慢,接近则聚焦后端或链路问题。

直接看 $request_time 和 $upstream_response_time 这两个日志字段,就能快速判断性能瓶颈在哪一环——是客户端网络、Nginx自身,还是后端服务。
区分 request_time 与 upstream_response_time 的实际含义
$request_time 是从 Nginx 收到第一个字节开始,到发完最后一个字节结束的总耗时,涵盖三段:
- 客户端上传请求数据的时间(尤其在大文件 POST 或弱网下可能很长)
- Nginx 转发请求 + 等待后端响应的时间
- Nginx 把响应内容下发给客户端的时间
$upstream_response_time 更聚焦:只记录 Nginx 与后端建立连接、发送请求、接收响应头(或完整响应体)这一段通信耗时,单位秒、精度毫秒。它不包含客户端侧延迟,也不含 Nginx 自身解析、重写等开销。
两者差值大,说明问题大概率出在客户端网络或 Nginx 下发环节;两者接近,就该重点查后端或 Nginx 到后端的链路。
用日志格式把关键时间变量落地
在 nginx.conf 的 log_format 中显式加入这两个字段,并搭配 $upstream_addr 定位具体节点:
log_format perf '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$request_time $upstream_response_time $upstream_addr';注意:$upstream_response_time 在重试时会以逗号分隔多个值(如 0.012,0.089),$upstream_addr 也严格按相同顺序对应,方便逐次排查哪一次转发慢、哪台机器响应差。
结合监控快速定位典型场景
常见组合及对应问题方向:
-
$request_time高,$upstream_response_time低 → 客户端上传慢(如移动端弱网、大表单提交)、或响应体太大导致下发耗时长 - 两者都高,且
$upstream_response_time在不同$upstream_addr上差异明显 → 某台后端节点异常(CPU 飙高、GC 频繁、磁盘 IO 堵塞) - 两者都高,但所有
$upstream_addr值接近 → 后端整体承压(应用逻辑阻塞、数据库慢查询、线程池耗尽)或 Nginx 到后端网络延迟上升(跨机房、中间设备抖动) -
$upstream_response_time出现大量-或超长值(如 >5s)→ 连接超时、后端拒绝连接、防火墙拦截、DNS 解析失败(若 upstream 使用域名且 resolver 配置不当)
辅助验证与轻量调试手段
不必每次都翻日志,可临时加响应头快速比对:
location /api/ {
add_header X-Request-Time $request_time;
add_header X-Upstream-Time $upstream_response_time;
add_header X-Upstream-Addr $upstream_addr;
}用 curl -I 发起单次请求,立刻看到本次请求在各环节的真实耗时和所选后端地址,适合压测抽样或线上快速验证。
真正影响处理性能的,往往不是单一模块,而是链路中某一段的放大效应。盯住这两个时间戳,再配上地址和状态码,多数响应延迟问题都能在几分钟内缩小范围。



















