$connection表示Nginx与上游服务器当前活跃的TCP连接数,$connection_requests表示单条连接生命周期内处理的HTTP请求数;二者结合可判断Keep-Alive复用效率:高连接数低请求数均值说明复用差,低连接数高请求数均值表明复用充分。

$connection 和 $connection_requests 是 Nginx 中两个关键的内置变量,专门用于观测上游(upstream)TCP 连接的复用效率。它们不直接反映客户端连接,而是聚焦于 Nginx 与后端服务(如应用服务器、API 网关)之间的连接行为。理解二者的关系,就能快速判断长连接是否真正被用起来,而不是“形同虚设”。
什么是 $connection:当前活跃的上游连接数
它表示此刻 Nginx 正在使用的、与后端保持 ESTABLISHED 状态的 TCP 连接数量。这个值是瞬时的、动态变化的。
- 新建一条连接(比如首次请求或旧连接超时关闭后重连),$connection 加 1
- 连接被主动关闭(如后端返回 Connection: close、keepalive_timeout 到期、或 Nginx 主动回收空闲连接),$connection 减 1
- 只要连接没断,即使处理了几十个请求,$connection 仍为 1
什么是 $connection_requests:单连接累计处理请求数
它记录的是**某一条 TCP 连接在其整个生命周期内成功转发并完成的 HTTP 请求总数**。该值在连接关闭时才最终确定,并可用于日志统计或监控平均复用率。
- 一条连接处理完第 1 个请求 → 计数为 1;处理完第 5 个 → 计数为 5;关闭时记为 5
- 若大量连接的 $connection_requests 值集中在 1,说明几乎每个请求都新建连接,“一用即弃”
- 稳定在 10–50+,通常意味着 Keep-Alive 配置合理、后端配合良好,HTTP/1.1 或 HTTP/2 复用生效
怎么用这两个变量看长连接有没有真正在用
单独看任一数值意义有限,必须结合趋势与比值分析:
- 高 $connection + 低平均 $connection_requests(如均值<2)→ 连接频繁新建/释放,常见于后端不返回 Keep-Alive、keepalive_timeout 设置过短、或 upstream 中 max_conns 触发强制建新连接
- 低 $connection + 高平均 $connection_requests(如均值>15)→ 复用充分,连接资源利用率高,延迟更平稳
- 突增的 $connection 值,需配合 upstream_addr 和 upstream_response_time 日志字段排查:是某个后端节点响应变慢导致连接堆积?还是出现连接泄漏未及时释放?
实际排查建议
可在 Nginx 日志中添加这两项做长期观测:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$http_user_agent" ' '
"$upstream_addr" $upstream_response_time $connection $connection_requests';
- 用 logrotate 定期归档,再用 awk / Prometheus + Grafana 统计每分钟平均 $connection_requests
- 对比不同 upstream 块的指标,识别异常节点(例如某台机器平均复用仅 1.2,其余都在 25+)
- 检查后端服务是否在响应头中返回 Connection: close;确认 Nginx upstream 中 keepalive 指令已配置(如 keepalive 32;)且未被覆盖










