最快速低成本识别后端慢查询与网关瓶颈的方式是直接分析Nginx日志中的$request_time(总耗时)和$upstream_response_time(纯后端响应耗时),二者差异指向Nginx层或网络问题,接近且偏高则指向后端服务内部。

直接看 Nginx 访问日志里的 $request_time 和 $upstream_response_time 字段,是识别后端慢查询与网关层性能瓶颈最快速、最低成本的方式。
关注两个核心时间字段的含义与差异
Nginx 日志中必须启用并记录以下两个变量:
- $request_time:从接收客户端第一个字节到发送完响应最后一个字节的总耗时(单位:秒,精度毫秒),包含 Nginx 自身处理、网络传输、上游等待、上游响应全过程;
-
$upstream_response_time:Nginx 与 upstream(如后端应用)建立连接后,到收到完整响应所花的时间,即纯后端服务响应耗时(多个 upstream 会以逗号分隔,如
0.002, 0.845)。
若 $request_time 显著大于 $upstream_response_time(比如差值 >200ms),说明瓶颈可能在 Nginx 本体(如 SSL 握手、大 body 解析、限流排队)或网络链路;若两者接近且同时偏高,则问题大概率出在后端服务内部(如数据库慢查、同步阻塞逻辑、GC 暂停等)。
用日志快速定位慢请求模式
借助常用命令组合,可即时发现异常分布:
- 查 TOP 10 最慢请求:
awk '{print $NF,$(NF-1)}' access.log | sort -k1nr | head -10(假设最后两列为$upstream_response_time和$request_time); - 统计超 1s 的请求数及对应接口:
awk -F'"' '$(NF-1) > 1 {print $2}' access.log | cut -d' ' -f2 | sort | uniq -c | sort -nr; - 检查是否存在“长尾”现象:用
histogram工具或简单脚本对$request_time做分桶统计(如 0–100ms / 100–500ms / 500–1000ms / 1s+),观察是否少量请求拖累整体 P95/P99。
结合状态码与 upstream 状态交叉分析
单看耗时不全面,需联动其他字段缩小范围:
-
5xx 错误 + 高 upstream_time:常见于后端崩溃、超时熔断或连接池耗尽,此时
$upstream_response_time可能显示为 “-” 或极小值(连接未建就失败),也可能是接近 timeout 设置值(如 30s); - 200 响应 + 高 request_time 但 upstream_time 很低:典型如大文件下载、客户端弱网上传、Nginx 启用了 gzip 或 sub_filter 等耗 CPU 处理、或存在 proxy_buffering off 导致流式转发阻塞;
-
同一 upstream 地址反复出现高响应时间:用
awk '{print $(NF-1), $NF, $6}' access.log | grep -v "-" | sort -k1nr | head -20($6 是请求行,含 upstream 地址或 host),可识别具体哪台后端实例异常。
落地建议:让日志真正可用
默认日志格式往往不包含关键字段,需主动配置:
- 在
http或server块中定义日志格式:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $upstream_addr'; - 确保
access_log使用该格式,并开启buffer和flush(如access_log /var/log/nginx/access.log main buffer=16k flush=1s;)以平衡性能与实时性; - 对生产环境,建议将
$request_time和$upstream_response_time单独写入结构化日志(如 JSON 格式),便于 ELK 或 Loki 做聚合分析与告警(例如:P99 request_time > 800ms 触发通知)。
不复杂但容易忽略。


















