通过分析$upstream_addr与$upstream_response_time日志组合,可精准定位拖慢响应的后端节点;需确保log_format包含二者,再用awk聚合统计均值或p95耗时,结合$request_time排除nginx层干扰,并辅以响应头实时验证。

直接看$upstream_response_time和$upstream_addr的组合日志,就能定位哪台后端在拖慢整体响应。
确认是否真有节点响应异常
轮询本身不感知后端快慢,所以必须靠日志证据说话。先确保 Nginx 日志中已启用这两个关键字段:
-
$upstream_addr:记录实际通信的后端 IP:端口,如192.168.1.10:8080 -
$upstream_response_time:单位秒、毫秒精度,只算 Nginx 与后端之间的通信耗时(不含客户端上传或 SSL 握手) - 二者严格一一对应,重试时用逗号分隔,失败位置标为
-,例如0.021, -表示第一次成功、第二次连接失败
检查 log_format 是否包含这两项,比如:
快速识别慢节点的两种方法
不用等压测或告警,日常日志就能发现苗头:
-
按地址聚合统计平均耗时:
用 awk 提取每个后端的响应时间并求均值:
awk '$NF ~ /:/ {print $(NF-1), $NF}' /var/log/nginx/access.log | awk '{sum[$2]+=$1; cnt[$2]++} END {for (i in sum) print i, sum[i]/cnt[i]}' | sort -k2 -n -
查 P95 或超时集中点:
筛选出$upstream_response_time > 0.5的请求,再统计这些慢请求里哪个$upstream_addr出现最多;若某台机器占了慢请求的 70% 以上,基本就是它在拖累
排除干扰因素,验证是不是真慢
响应时间高 ≠ 后端真有问题,要排除 Nginx 层面的干扰:
- 对比
$upstream_response_time和$request_time:如果后者远大于前者(比如差 1 秒以上),说明延迟可能来自客户端网络、SSL 握手或 Nginx 自身处理,不是后端问题 - 检查该节点是否被频繁重试:
$upstream_response_time中出现多个逗号分隔值(如0.012, 0.485),说明第一次转发失败、Nginx 自动重试,这会拉高平均值,也暴露健康检查没起作用 - 查看 error.log 是否有大量
connect() failed或no live upstreams,结合max_fails配置判断该节点是否已被剔除但又反复试探
辅助验证:单次请求实时观察
不想翻日志?加两行响应头,curl 一下就清楚:
- 在对应 location 块中加入:
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Time $upstream_response_time; - 执行:
curl -I https://your-domain/api/test
返回头里就能看到这次请求打到了哪台机器、耗时多少,反复几次,慢节点立刻浮现











