nginx 不直接提供 tcp 连接生命周期跟踪能力,但可通过 $connection、$connection_requests、$msec 等变量结合日志定制与外部监控工具实现近实时可观测性。

Nginx 本身不提供“连接生命周期”的实时跟踪能力,因为它工作在应用层(HTTP),而 TCP 连接的建立、保持、关闭等行为发生在传输层,Nginx 默认不暴露完整的连接状态时序。但你可以通过组合使用 Nginx 内置变量、日志格式定制、$connection 和 $request_time 等关键变量,再配合外部工具(如 logtail + Prometheus + Grafana 或 socket 监听),逼近对单个 HTTPS 连接生命周期的可观测性。
抓取连接级基础指标:$connection、$connection_requests、$msec
这些变量是理解连接生命周期的起点:
- $connection:当前请求所属的 TCP 连接唯一整数 ID(同一连接内多个请求共享该值),可用于关联同连接的多个请求日志行;
- $connection_requests:该连接已处理的请求数(从 1 开始递增),突增或骤降可提示连接复用异常或提前中断;
- $msec:日志写入时刻的秒级时间戳(精度为毫秒),结合 $request_time 可估算请求在连接中的耗时分布。
建议在 log_format 中显式记录:
识别连接起始与终止的关键信号
Nginx 不直接记录 connect/disconnect 事件,但可通过日志模式间接推断:
-
连接开始:首个请求中
$connection_requests == 1,且此前无该$connection的日志记录 —— 表示新 TCP 连接建立(注意:TLS 握手完成才触发第一个 HTTP 请求); -
连接结束:该
$connection对应的日志条目突然消失,且后续无新请求(需依赖日志采集的连续性与时效性);更可靠的方式是捕获$status为499(client closed request)或502/504(upstream timeout/disconnect),常伴随$request_time异常短或长,暗示连接异常中断或服务端主动关闭。
增强 HTTPS 连接上下文:SSL/TLS 变量
启用 ngx_http_ssl_module 后,以下变量可补充加密连接特征:
- $ssl_protocol、$ssl_cipher:标识 TLS 版本与密钥套件,用于区分不同安全等级的连接生命周期;
-
$ssl_session_reused:值为
"s"(session reused)、"."(not reused)或"r"(resumed),帮助判断是否复用已有连接,避免将多次请求误判为多个连接; -
$ssl_client_cert(配合
ssl_verify_client):若启用双向认证,可绑定客户端证书指纹到连接 ID,实现用户级连接追踪。
落地建议:轻量级实时分析链路
不依赖重代理或修改 Nginx 源码,推荐如下最小可行方案:
- 用
tail -f或filebeat实时采集 access_log,按$connection分组聚合; - 用 Logstash 或 Python 脚本解析日志流,提取每条记录的
connection_id、requests_count、timestamp、status、request_time; - 内存中维护连接状态映射表:
{conn_id → {first_seen, last_seen, total_requests, latest_status}},超时(如 30s 无新请求)则标记为 closed; - 将状态变化(new / active / closed)推送至 Prometheus(用
counter或gauge类型),Grafana 中按connection标签做下钻分析。











