Nginx stream模块支持基于预定义变量的连接级日志记录,需在stream上下文中配置log_format和access_log,可记录客户端IP、时间、字节数、后端地址及连接时长,并通过日志分析工具实现基础统计。

Nginx 的 stream 模块本身不支持像 http 模块那样直接使用 log_format 和 access_log 记录详细连接日志(如客户端 IP、目标地址、连接时长、字节数等),但通过合理配置和辅助手段,可以实现代理日志记录与基础统计。
启用 stream 日志功能
stream 模块支持 log_format 和 access_log,但仅限于预定义变量,且需在 stream 上下文中定义。关键点是:日志只能记录连接建立/关闭事件,无法记录 HTTP 层内容(如 URI、状态码)。
- 必须在
stream { ... }块顶层定义log_format,不能放在upstream或server内 -
access_log需配置在server块中,或继承自stream块默认设置 - 常用变量包括:
$remote_addr、$server_addr、$upstream_addr、$time_iso8601、$session_time(连接持续秒数)、$bytes_sent、$bytes_received
配置示例:记录 TCP 代理连接日志
以下是一个典型配置,用于记录四层代理的连接信息:
stream {
log_format proxy_log '$remote_addr [$time_iso8601] '
'$session_time '
'$bytes_received/$bytes_sent '
'$upstream_addr';
access_log /var/log/nginx/stream-access.log proxy_log;
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 12345;
proxy_pass backend;
access_log /var/log/nginx/stream-12345.log proxy_log;
proxy_timeout 30s;
}
}
该配置会为每个 TCP 连接生成一条日志,包含来源 IP、时间、传输字节数、后端地址及连接时长。
实现基础统计:借助日志分析工具
stream 日志是纯文本格式,适合用标准 Linux 工具做实时或离线统计:
- 每秒连接数:
tail -f /var/log/nginx/stream-access.log | awk '{print $2}' | cut -d'[' -f2 | cut -d':' -f1,2 | uniq -c - Top 客户端 IP:
awk '{print $1}' /var/log/nginx/stream-access.log | sort | uniq -c | sort -nr | head -10 - 平均连接时长:
awk '{sum += $4; count++} END {print "avg:", sum/count}' /var/log/nginx/stream-access.log - 配合
goaccess或lnav可视化分析(需确保日志格式匹配其 parser)
增强统计能力的可行方案
若需更细粒度指标(如按目标端口、协议类型、错误率),可考虑以下方式:
- 为不同
server块指定独立access_log文件,再按文件分类统计 - 使用
syslog输出日志到集中式日志系统(如 Loki + Promtail),便于标签化与查询 - 结合
nginx-module-vts(仅支持 http)不可用;但可用外部程序监听日志文件,解析后上报 Prometheus(例如用mtail或自研脚本) - 对于关键业务,可在后端服务侧开启连接日志,Nginx stream 层只做连接透传+基础审计
不复杂但容易忽略:stream 日志默认不记录失败连接(如 upstream 不可达),如需捕获此类事件,应开启 error_log 并调高级别(notice 或 info),同时注意磁盘空间与性能影响。


















