审计单条长连接复用效率的关键是在Nginx日志中正确引用只读变量$connection(同一TCP连接所有请求值相同)和$connection_requests(该连接当前累计处理请求数),再按$connection分组统计最大$connection_requests以计算平均复用次数、分布及异常情况。

要审计单条长连接的复用效率,关键不是直接“配置”$connection和$connection_requests这两个变量,而是**在 Nginx 日志中正确引用它们,并结合日志分析逻辑识别同一连接上的请求复用行为**。这两个变量是 Nginx 内置的只读状态变量,无需手动配置,但需确保使用场景和日志格式满足审计需求。
理解两个变量的实际含义
$connection:当前请求所使用的 TCP 连接的唯一序号(从 Nginx 启动开始单调递增的整数),**同一物理连接上所有请求共享相同的 $connection 值**。$connection_requests:该 TCP 连接**当前已处理的请求数量(含本次)**,每次请求结束时自增 1。
因此,若你在日志中同时记录这两个字段,就能识别出:
- 哪些请求属于同一个底层连接(
$connection相同) - 该连接被复用了多少次(看
$connection_requests的最大值或增长跨度)
在 log_format 中正确引用变量
在 http 或 server 块中定义日志格式,例如:
'"$request" $status $body_bytes_sent '
'conn:$connection reqs:$connection_requests '
'"$http_user_agent" "$http_referer"';
然后在 access_log 中启用它:
⚠️ 注意:$connection_requests 在请求结束时才更新,所以日志中记录的是「该请求完成后,此连接累计处理的请求数」;而 $connection 在请求接入时即确定,稳定不变。
识别复用效率的关键分析逻辑
仅靠单行日志无法直接得出“复用效率”,需按 $connection 分组聚合分析。典型审计目标包括:
-
平均复用次数:对每个
$connection取其最大$connection_requests值(即该连接生命周期内总请求数),再对所有连接求均值 -
复用率分布:统计有多少连接只用了 1 次(
$connection_requests == 1)、用了 2–5 次、6 次以上等 -
异常低效连接:发现大量
$connection_requests == 1的连接,可能说明客户端未开启 keepalive、服务端过早关闭连接(如keepalive_timeout太短),或存在代理层干扰
可用 awk / logstash / Prometheus + nginx-exporter 等工具做后续分析。例如简单统计各连接的最终请求数:
awk '{c[$9] = $10} END {for (i in c) print i, c[i]}' /var/log/nginx/audit_conn.log | sort -k2 -n(假设 $connection 是第 9 字段,$connection_requests 是第 10 字段)
确保长连接实际生效的前提条件
即使日志记录了变量,若连接根本没复用,审计结果也无意义。需检查:
- 客户端是否发送
Connection: keep-alive和Keep-Alive: timeout=... - Nginx 配置中
keepalive_timeout是否合理(如keepalive_timeout 60s) - 是否启用了
keepalive_requests(默认 100),避免单连接请求数超限被断开 - 后端(如 upstream)是否也配置了
keepalive指令(针对 proxy 场景)
没有这些基础,$connection_requests 多数会恒为 1,复用效率自然为零。


















