$upstream_connect_time可精准定位网关至后端的网络层抖动,专指tcp连接建立耗时(含dns解析、syn重传等),不掺杂后端处理逻辑;需结合upstream_addr分析异常节点、检查error.log确认建连有效性,并与upstream_header_time差值分层归因网络或tls/业务瓶颈。

直接看 $upstream_connect_time 就能揪出网络慢节点——它只记录 TCP 连接建立耗时(SYN→SYN-ACK→ACK),不掺杂后端处理、TLS 握手或响应传输,是定位链路层瓶颈最干净的信号。
确认日志里有真实有效的值
这个变量只在三次握手成功后才有数值,失败或未建连时显示为 - 或空。大量 0.000 不代表飞快,很可能是 DNS 解析失败、目标端口没监听、防火墙拦截,或 upstream 配置根本没生效。务必同步检查 error.log 中是否有:
connect() failedConnection refusedno live upstreams-
resolver timeout(尤其 upstream 用了域名但没配 resolver)
按 upstream_addr 聚合分析,锁定异常节点
把 $upstream_connect_time 和 $upstream_addr 一起记录,再用命令快速统计:
awk '$12 != "-" && $12 > 0.1 {print $11}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
输出类似:
427 10.10.3.15:808012 10.10.3.16:80803 10.10.3.17:8080
说明 10.10.3.15 是明显 outlier。立刻登录该节点查:
-
ss -s | grep "inuse"(看已分配但未 accept 的连接数是否积压) -
netstat -s | grep -i "syn"(查 SYN 队列溢出或丢包) -
cat /proc/sys/net/core/somaxconn和net.ipv4.tcp_tw_reuse是否合理 -
iptables -L -t raw -v(确认有没有早期丢包规则)
看分布和波动,区分持续问题与瞬时毛刺
不是所有高值都一样严重:
-
持续偏高(P95 > 100ms):大概率是宿主机网络栈配置问题,比如
net.ipv4.tcp_tw_reuse关闭、net.core.somaxconn过小、或 iptables ACCEPT 链路延迟 - 偶发尖峰(单次 > 300ms):可能 SYN 包被中间设备丢弃、软中断不均、或某次 GC 导致 accept 队列短暂阻塞
- 周期性抬升(如每 60 秒一批 > 200ms):重点查后端 JVM Full GC、容器滚动更新、服务注册中心心跳刷新,或 DNS 缓存过期后 resolver 同步阻塞
结合 $upstream_header_time 做分层归因
单看 connect_time 容易误判。真正关键的是它和 $upstream_header_time 的差值:
-
$upstream_connect_time = 0.120,$upstream_header_time = 0.125→ 差值仅 5ms,说明后端几乎没处理,问题纯在网络层或连接池 -
$upstream_connect_time = 0.002,$upstream_header_time = 0.310→ 差值 308ms,说明 TLS 握手、请求发送或后端首字节生成拖慢了整体,应查证书协商、HTTP/2 设置或慢 SQL -
$upstream_connect_time = "-"但$upstream_header_time有值 → 不可能,说明日志字段提取逻辑有误,或 upstream 没真正走 proxy_pass 流程











