$upstream_connect_time 记录 nginx 与上游服务器完成 tcp 三次握手的耗时(毫秒精度),不含 dns 解析、ssl 握手及传输处理时间,需 nginx ≥ 1.9.1 且在 proxy_pass 等代理场景下有效。

直接使用 $upstream_connect_time 即可记录 Nginx 与上游服务器完成 TCP 连接建立所耗费的时间(单位:秒,精度为毫秒,格式如 0.002 或 0.154),它不包含 SSL 握手或请求发送耗时,纯粹反映三次握手完成的瞬时延迟。
确认变量可用性与日志格式配置
$upstream_connect_time 是 Nginx 内置变量,但仅在 proxy_pass、fastcgi_pass 等上游代理场景中有效,且要求 Nginx ≥ 1.9.1。若使用较旧版本,该变量为空或为“-”。
- 在
http或server块中定义自定义日志格式,例如:
log_format upstream_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_addr $upstream_connect_time '
'$upstream_header_time $upstream_response_time';- 将该格式应用到
access_log指令中,确保日志写入路径可写; - 重启或重载 Nginx(
nginx -s reload)使配置生效。
理解 $upstream_connect_time 的精确含义
该变量记录的是从 Nginx 发起 connect() 系统调用开始,到内核返回连接成功(即 TCP 三次握手完成)为止的耗时,不含以下环节:
- DNS 解析时间(由
$upstream_resolve_time单独记录); - SSL/TLS 握手时间(属于后续阶段,不计入此值);
- 请求发送或响应接收的网络传输时间;
- 上游服务处理逻辑耗时(由
$upstream_response_time覆盖)。
若上游是 IP 地址直连(无 DNS),且未启用 TLS,则 $upstream_connect_time 就是最接近“纯网络建连延迟”的指标。
排查常见异常值与典型问题
日志中出现较大或异常值(如 >1s 或全为“-”)往往指向具体瓶颈:
- 值为“-”:表示未进入 upstream 阶段(如 4xx/5xx 错误由 Nginx 自身返回)、上游地址解析失败、或请求被限流/拒绝前就中断;
- 持续偏高(如 >300ms):检查上游服务器 TCP backlog 是否满、SYN queue 溢出,或中间网络存在 ICMP 限制、防火墙延迟;
-
偶发尖峰(如正常 2ms,突增至 800ms):可能受上游主机 CPU 过载、网卡软中断不均、或本地连接池复用失效(如
keepalive未配置)导致频繁重建连接; - 多个 upstream_addr 对应不同 connect_time:可用于横向比对各节点建连健康度,辅助识别异常实例。
结合其他 upstream 变量做联合分析
单看 $upstream_connect_time 不足以定位全链路瓶颈,建议与以下变量并行采集:
-
$upstream_resolve_time:判断 DNS 解析是否拖慢建连(尤其当 upstream 使用域名时); -
$upstream_header_time:从建连完成到收到上游响应首字节的时间,含 SSL 握手 + 请求发送 + 服务处理; -
$upstream_response_time:完整 upstream 耗时(建连 + header + body 传输); -
$request_time:客户端视角总耗时,用于反推 Nginx 本机处理开销。
例如:若 $upstream_connect_time 稳定在 5ms,但 $upstream_header_time 波动剧烈(50ms ~ 2s),说明问题大概率在 SSL 握手或上游服务响应上,而非网络层建连。











