必须在 stream 块内配置 log_format + access_log + stream 专用变量,如 $remote_port、$bytes_sent 等,日志路径需可写且编译启用 --with-stream 模块。

要记录 TCP/UDP 四层代理的连接源端口、传输字节等关键信息,必须在 stream 上下文中配置日志,不能复用 http 模块的日志方式。核心是组合 log_format(定义字段) + access_log(启用输出) + 正确变量(取值来源),且所有配置都需严格落在 stream { } 块内。
日志格式必须定义在 stream 块顶层
不能写在 http 或 server 内部,否则无效。使用 log_format 指令声明格式名,并引用 stream 专用变量:
stream {
log_format stream_detail
'$time_iso8601|$remote_addr:$remote_port|$server_addr:$server_port|'
'$upstream_addr|$session_time|'
'$bytes_sent|$bytes_received';
upstream backend {
server 192.168.1.10:8080;
}
server {
listen 8443;
proxy_pass backend;
access_log /var/log/nginx/stream-access.log stream_detail;
proxy_timeout 30s;
}
}关键变量说明与用途
-
$remote_port:客户端发起连接时使用的源端口,直接对应“访问源端口” -
$bytes_sent:Nginx 向客户端发送的总字节数(即响应数据量) -
$bytes_received:Nginx 从客户端接收的总字节数(即请求数据量) -
$session_time:连接持续时间(秒,含毫秒精度),反映连接生命周期 -
$upstream_addr:实际转发到的后端地址(含端口),可用于验证路由结果
确保日志能写入的必要条件
- 日志路径(如
/var/log/nginx/stream-access.log)所在目录需赋予nginx工作进程可写权限 - Nginx 编译时必须启用
--with-stream(基础)和--with-stream_realip_module(如需真实$remote_addr) -
access_log必须放在server块内,不可置于upstream或stream顶层 - 每次连接关闭(正常或超时)时写入一行日志,不是实时流式写入
常见问题排查提示
- 日志文件为空?检查
nginx -t配置语法,确认access_log行无拼写错误,路径存在且权限正确 -
$remote_port显示为-?说明连接未成功建立(如 SYN 被丢弃),或前端有 LVS/NAT 且未开启proxy_protocol on - 字节数始终为 0?确认后端服务确实返回了数据;UDP 场景中单次收发也会计入,但不累计跨包会话
不复杂但容易忽略


















