$connection表示nginx与上游服务器当前已建立且未关闭的tcp连接数,反映实时连接通道数量;$connection_requests表示单个tcp连接在其生命周期内处理的http请求数,用于衡量连接复用效率。

这两个变量常见于 Nginx 的日志和状态模块(如 ngx_http_upstream_module 或 stub_status),用于观测后端连接的复用效率,但它们**不是通用 TCP 协议层变量**,而是 Nginx 在应用层对连接生命周期的统计抽象。理解它们的关键,在于区分“连接建立”与“请求发送”这两个动作是否复用。
什么是 $connection
它表示当前活跃的、已与后端服务器建立的 TCP 连接数(即处于 ESTABLISHED 状态、尚未关闭的连接)。这个值反映的是 Nginx 与上游服务之间**正在使用的连接通道数量**。
例如:
- Nginx 启动后第一次向
backend:8080发起请求 → 建立 1 条 TCP 连接 →$connection = 1 - 后续 5 个请求都复用这条连接(Keep-Alive 开启且未超时)→
$connection仍为 1 - 若后端返回
Connection: close,或 Nginx 主动关闭空闲连接,则该连接释放 →$connection变为 0
什么是 $connection_requests
它表示**单个 TCP 连接在其生命周期内处理过的 HTTP 请求总数**,是每个连接的“服务次数”计数器。Nginx 在连接关闭时会将该连接的请求数累加到全局统计中,也可通过变量在日志中记录每条连接的贡献。
例如:
- 一条连接先后处理了 8 个请求后被关闭 → 它对应的
$connection_requests值为 8 - 若平均值长期低于 2,说明连接基本“一用即弃”,复用率极低;若稳定在 10–50+,说明 Keep-Alive 和后端配合良好
- 该值越高,越能体现 HTTP/1.1 Keep-Alive 或 HTTP/2 多路复用的实际收益
如何用它们判断复用效果
单独看任一变量意义有限,关键看二者的关系和趋势:
- 高 $connection + 低 $connection_requests 平均值:连接频繁新建/断开,可能是后端不支持 Keep-Alive、超时太短、或客户端强制关闭
- 低 $connection + 高 $connection_requests 平均值:连接复用充分,资源利用率高,延迟更稳
-
突增的 $connection:可能触发了连接池扩容(如
upstream中配置了max_conns限制)、后端响应变慢导致连接堆积,或出现连接泄漏 - 结合
upstream_addr和upstream_response_time日志字段,可定位是哪个后端节点复用异常
影响复用的底层因素
Nginx 层面的变量只是表象,真正决定能否复用的是协议行为和系统配置:
-
HTTP 版本:HTTP/1.1 依赖
Keep-Alive: timeout=15响应头;HTTP/2 默认多路复用,无需显式头 -
后端响应头:若后端返回
Connection: close,Nginx 不会复用该连接 -
Nginx 配置:
keepalive 32(连接池最大空闲连接数)、keepalive_timeout 60s(空闲连接保持时间)直接影响$connection的稳定性 -
系统级限制:Linux 的
net.ipv4.tcp_tw_reuse = 1和时间戳启用,支撑高频连接回收,间接保障连接池健康运转










