精准捕捉缓存回源连接延迟需绑定$upstream_cache_status与$upstream_connect_time分析:仅MISS、EXPIRED、BYPASS等回源状态才具有效连接耗时,应通过融合日志格式记录并聚焦此类样本,结合$upstream_addr归因到具体后端节点,分层排查网络、TLS或源站瓶颈。

要精准捕捉缓存回源时的连接延迟,关键不是单独看 $upstream_connect_time,而是把它和缓存状态变量 $upstream_cache_status 绑定分析——只有真正回源的请求(如 MISS、EXPIRED、BYPASS)才具备该值,且此时它反映的是“从 Nginx 主动发起 TCP 连接到后端源站”的真实耗时。
确保日志格式同时包含缓存状态与连接时间
在 http 块中定义一个融合型日志格式,显式包含两者,并保持字段顺序清晰便于解析:
log_format cache_connect_log '$remote_addr [$time_local] "$request" $status ' '$upstream_cache_status $upstream_connect_time $upstream_response_time ' '"$http_user_agent"';- 在启用缓存的
location块中应用:access_log /var/log/nginx/cache_connect.log cache_connect_log; - 注意:
$upstream_connect_time在HIT或STALE场景下为-或空,无需过滤,天然与缓存状态对齐
聚焦回源类状态,排除干扰样本
分析日志时只提取明确触发回源的条目,避免把本地缓存响应混入统计:
-
MISS:首次访问或缓存彻底失效,$upstream_connect_time完全代表建连开销 -
EXPIRED:缓存过期后发起条件请求(如带If-Modified-Since),此时建连时间仍有效,但需结合$upstream_status判断是否真收到 304(若为 200,则后续还有响应体传输) -
BYPASS:因proxy_cache_bypass跳过缓存,强制回源,其$upstream_connect_time可直接用于评估“非缓存路径”的网络质量 - 跳过
HIT、STALE、REVALIDATED等不建连的状态,它们的$upstream_connect_time无意义
用连接时间定位回源链路瓶颈
当发现某类回源请求的 $upstream_connect_time 异常偏高,可分层排查:
- 持续 >100ms:检查源站所在宿主机的网络队列、防火墙 ACCEPT 延迟、目标端口是否被限速(如 iptables rate-limit)
- 偶发 60s 超时:重点查源站进程是否僵死、负载均衡器(如 SLB)健康检查失准、DNS 解析失败(若
upstream使用域名) - 值为
-但状态却是MISS:说明请求根本没走到 upstream 阶段,可能是proxy_pass指令未生效、匹配了错误的location、或被rewrite中断 - 对比
$upstream_connect_time和$upstream_header_time:若两者接近,说明后端处理飞快,问题纯属网络层;若后者远大于前者,说明 TLS 握手、请求发送或后端业务逻辑拖慢了整体响应
配合 upstream_addr 实现节点级归因
在日志中加入 $upstream_addr,能把高连接延迟精确到具体后端实例:
- 修改日志格式:
'$upstream_cache_status $upstream_addr $upstream_connect_time' - 若某 IP:Port 频繁出现高
$upstream_connect_time,可单独对该节点做telnet ip port或curl -v测试,确认是单点故障还是全局问题 - 若多个地址轮询中仅个别延迟高,说明 Nginx 的健康检查未及时摘除异常节点,需检查
max_fails和fail_timeout设置


















