$upstream_connect_time自Nginx 1.9.1起支持,记录Nginx与上游服务建立TCP连接(含SSL握手)耗时,单位秒、毫秒精度,仅proxy_pass等upstream场景有效,非upstream请求显示“-”。

直接在 Nginx 的 log_format 中使用 $upstream_connect_time,就能记录从网关发起 TCP 连接到后端服务完成握手所耗费的时间(单位:秒,精确到毫秒)。这是排查“为什么请求卡在 upstream”最直接的指标之一。
确认 Nginx 版本支持
$upstream_connect_time 自 Nginx 1.9.1 起引入,且要求启用 http_upstream_module(默认已编译)。可通过以下命令验证:
-
nginx -V 2>&1 | grep -o 'nginx version: nginx/[0-9.]*'—— 确保版本 ≥ 1.9.1 -
nginx -V 2>&1 | grep -q http_upstream_module && echo "ok"—— 确认模块存在
配置 log_format 并启用变量
在 http 块中定义日志格式,显式包含 $upstream_connect_time。注意它只在 proxy_pass、fastcgi_pass 等 upstream 场景下有值,非 upstream 请求会显示“-”或空:
log_format upstream_log '[$time_local] $remote_addr - $request '
'$status $body_bytes_sent '
'$upstream_addr $upstream_status '
'$upstream_connect_time $upstream_header_time $upstream_response_time';然后在 server 或 location 块中应用:
access_log /var/log/nginx/upstream_access.log upstream_log;
理解时间含义与典型场景
$upstream_connect_time 仅反映 TCP 连接建立耗时(SYN → SYN-ACK → ACK),不含 TLS 握手或 HTTP 请求发送时间。常见情况包括:
- 值持续 > 100ms:后端实例所在宿主机网络拥塞、防火墙策略延迟、目标端口未监听或被限速
- 偶发超时(如 60s):后端服务宕机、负载均衡器丢包、DNS 解析异常(若 upstream 使用域名)
- 值为“-”:该请求未进入 upstream 流程(例如命中本地缓存、返回 4xx/5xx 由 Nginx 直接生成)
结合其他 upstream 变量交叉分析
单看 $upstream_connect_time 不够,需搭配以下变量定位瓶颈环节:
-
$upstream_header_time:从连接建立完成到收到后端响应首行的时间,含 TLS 握手 + 请求发送 + 后端处理 + 响应头返回 -
$upstream_response_time:从连接建立完成到收到完整响应体的时间 - 若
connect_time ≈ header_time,说明后端处理极快,瓶颈在连接层;若header_time ≫ connect_time,说明问题在 TLS、请求转发或后端业务逻辑


















