可通过Nginx stream模块配合stream_log_format实现TCP/UDP四层连接的精细化日志记录,支持监控连接建立、断开、时长、客户端地址、后端服务等关键指标。

可以通过 Nginx 的 stream 模块配合自定义 log_format 实现四层(TCP/UDP)连接的精细化日志记录,用于监控连接建立、断开、时长、客户端地址、后端服务等关键指标。
启用 stream 模块并声明日志格式
Nginx 默认不加载 stream 日志相关变量,需在全局 stream { ... } 块外(即顶层)定义日志格式,且必须使用 stream_log_format(Nginx 1.11.4+),不是 log_format:
- 在
nginx.conf的 http 块之外、stream 块之前 添加:
stream_log_format main '$remote_addr:$remote_port -> $server_addr:$server_port '
'$status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" "$upstream_bytes_sent" "$upstream_bytes_received"';注意:stream_log_format 是独立指令,不可放在 http 或 stream 块内;变量如 $remote_addr、$session_time、$upstream_addr 等仅在 stream 上下文中有效。
在 stream 块中启用访问日志
在 stream { ... } 块内为 server 或 upstream 配置 access_log,引用上一步定义的格式:
- 示例 TCP 代理配置:
stream {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
<pre class='brush:php;toolbar:false;'>server {
listen 8443;
proxy_pass backend;
access_log /var/log/nginx/stream-access.log main; # 引用 main 格式
proxy_timeout 30s;
}}
关键点: access_log 必须写在 server 或 upstream 级别(不支持写在顶层 stream 块),且路径需确保 Nginx 进程有写权限。
常用监控变量说明与建议字段
以下变量对四层监控最有价值,可根据需要组合进 stream_log_format:
-
$remote_addr/$remote_port:客户端真实 IP 和端口(注意:若前端有 LVS 或 TCP 透传代理,需开启proxy_protocol on;并配合$proxy_protocol_addr) -
$server_addr/$server_port:Nginx 接收连接的本地地址和端口 -
$upstream_addr:实际转发到的后端地址(含端口),支持多个上游时显示选中的那个 -
$session_time:TCP 连接持续时间(秒,小数精度),是衡量连接稳定性与空闲超时的核心指标 -
$bytes_sent/$bytes_received:Nginx 向客户端发送/从客户端接收的字节数(不含 TLS 握手等底层开销) -
$upstream_bytes_sent/$upstream_bytes_received:Nginx 与后端交互的字节数,可用于识别上下游流量不对称问题 -
$status:连接结果状态码,常见值包括100(成功建立)、400(协议错误)、403(拒绝)、500(上游不可达)
配合日志分析实现基础监控
生成的日志可直接接入 ELK、Grafana Loki 或用脚本统计:
- 统计每分钟新建连接数:
awk '{print $1}' stream-access.log | cut -d: -f1 | sort | uniq -c | sort -nr - 查看平均会话时长:
awk '{sum += $7; n++} END {print sum/n}' stream-access.log($7 对应$session_time) - 识别异常高延迟连接:
awk '$7 > 300 {print}' stream-access.log(超过 5 分钟的长连接) - 检查后端分布是否均衡:
awk '{print $10}' stream-access.log | sort | uniq -c($10 对应$upstream_addr)
建议将 session_time 和 status 作为告警核心字段,结合 Prometheus + nginx-lua-module 可进一步实现实时指标暴露。


















