$upstream_connect_time 是 nginx 定位后端连接延迟最干净的指标,仅记录 tcp 三次握手完成耗时(秒,毫秒精度),不包含 dns、ssl、业务处理或数据传输;需 nginx ≥1.19.10,显式配置 log_format 并启用 access_log 才可采集。

$upstream_connect_time 是 Nginx 定位后端连接延迟最干净的指标——它只记录 TCP 三次握手完成耗时(单位:秒,毫秒精度),不掺杂 DNS、SSL、业务处理或数据传输。用好它,就能把“网络慢”从“后端慢”里单独揪出来。
确认变量可用并写入日志
这个变量默认不会出现在日志里,必须主动配置才能采集:
- Nginx 版本需 ≥ 1.19.10(执行
nginx -v验证); - 在
http或server块中定义日志格式,显式包含该变量,例如:log_format upstream_full '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent ' '<br> "$http_referer" "$http_user_agent" ' '<br> $upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time';
- 将该格式应用到
access_log,确保日志路径可写; - 执行
nginx -s reload生效。
识别四类典型建连瓶颈
看日志中 $upstream_connect_time 的分布和数值特征,能快速定位问题根源:
- 跨地域延迟高:值稳定在 80–200ms(如上海 Nginx → 深圳后端),而同机房通常
-
后端 accept 队列满:某几个
$upstream_addr出现持续尖峰(如从 3ms 突增至 300ms+),其他节点正常 → 检查net.core.somaxconn是否足够,或后端 accept 线程是否阻塞(如 PHP-FPM 子进程耗尽、Swoole Worker 打满); - 中间设备丢包:数值呈阶梯式增长(0.003、0.007、0.015、0.031…),这是内核 SYN 重传行为,指向防火墙/NAT 丢包或 ICMP 限制;
-
连接未真正建立:大量出现
-或0.000,不是快,而是失败——可能端口未监听、防火墙拦截、DNS 解析失败,或 upstream 配置未生效。
联动调优:让慢连接更快暴露或更少发生
单靠监控不够,要配合配置落地改进:
- 设合理的
proxy_connect_timeout:基于实测 P95 × 1.5~2,同机房建议 3–5s,跨可用区 5–8s,海外回源 800ms–1.5s; - 启用连接池复用:
upstream块中加keepalive 32,location 中配proxy_http_version 1.1和proxy_set_header Connection '',避免频繁建连引入抖动; - 开启健康检查:interval 比
proxy_connect_timeout大 2–3 秒,max_fails=2,自动剔除建连异常节点; - 配合重试机制:
proxy_next_upstream error timeout+proxy_next_upstream_tries 2,降低单点建连失败对用户的影响。
对比分析与分层归因
单看 $upstream_connect_time 不够,要结合其他变量做差值分析:
-
$upstream_header_time − $upstream_connect_time显著大于 0 → 延迟发生在 SSL 握手或请求发送阶段; -
$upstream_response_time − $upstream_header_time明显偏高 → 问题在后端处理逻辑; - 多个
$upstream_addr对应不同$upstream_connect_time→ 可横向比对,精准识别异常实例,辅助灰度下线或扩容。











