ngx_stream_proxy_module可通过log_format、access_log和内置变量在stream上下文中实现tcp/udp连接级日志记录;需编译启用--with-stream和--with-stream_realip_module,log_format定义在stream块顶层,access_log置于server块内,使用$remote_addr、$upstream_addr、$session_time等变量记录连接元数据与统计信息。

ngx_stream_proxy_module 本身不直接支持记录四层连接日志(如 TCP/UDP 连接建立、关闭、客户端 IP、后端地址、耗时等),但可通过组合使用 log_format、access_log 和内置变量,在 stream 上下文中实现较完整的连接级日志记录。
启用 stream 日志功能的前提配置
确保 Nginx 编译时已启用 --with-stream 和 --with-stream_realip_module(如需真实客户端 IP)。在主配置块(非 http 块)中定义日志格式与输出目标:
- 日志必须定义在
stream { ... }块顶层,不能放在 server 或 upstream 内部 -
log_format需使用stream类型标识(Nginx 1.11.4+ 支持) -
access_log必须置于server块内,且路径需有写权限
定义适用于 stream 的日志格式
stream 模块提供一组专用变量,例如:
-
$remote_addr:客户端原始地址(若未启用 realip,可能为 LVS 或代理 IP) -
$remote_port:客户端源端口 -
$server_addr:服务监听的本地 IP -
$server_port:服务监听端口 -
$upstream_addr:实际转发到的后端地址(含端口,多个后端以逗号分隔) -
$upstream_bytes_sent/$upstream_bytes_received:转发给后端/从后端收到的字节数 -
$session_time:TCP 连接持续时间(秒,精度毫秒,Nginx 1.13.9+) -
$time_iso8601:ISO8601 格式时间戳
示例定义(放在 stream { } 块顶部):
log_format basic_stream '$time_iso8601|$remote_addr:$remote_port|$server_addr:$server_port|'
'$upstream_addr|$session_time|$upstream_bytes_sent|$upstream_bytes_received';在 server 块中启用 access_log
每条连接建立并完成数据交换后(或超时断开时),Nginx 会写入一行日志。注意:stream access_log 是 per-connection,不是 per-packet:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
stream {
log_format basic_stream '...'; # 如上
<pre class="brush:php;toolbar:false;">upstream backend_tcp {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
server {
listen 8000;
proxy_pass backend_tcp;
proxy_timeout 30s;
# 启用连接日志
access_log /var/log/nginx/stream_access.log basic_stream;
error_log /var/log/nginx/stream_error.log warn;
}}
该配置会在每次 TCP 连接关闭(无论正常 FIN 还是 RST/超时)时,记录一条包含连接元信息和统计字段的日志行。
获取真实客户端 IP(可选但关键)
如果前端有 LVS(DR/TUN)、HAProxy 或云 SLB,需配合 set_real_ip_from + real_ip_header 提取真实 IP:
- 启用
--with-stream_realip_module - 在
server块中添加:set_real_ip_from 10.0.0.0/8;(填写可信代理网段) - 指定透传头字段,如 LVS 使用
real_ip_header Proxy-Protocol;,HAProxy 启用 PROXY 协议时设为PROXY - 确保上游负载均衡器开启 PROXY 协议(如 HAProxy 的
send-proxy)
启用后,$remote_addr 将自动替换为真实客户端 IP,日志中即可体现真实来源。










