nginx stream模块实现四层tcp/udp负载均衡需启用--with-stream、配置独立stream块、定义upstream与server,仅基于ip端口转发,低延迟高吞吐,适用于数据库、dns等场景。

要用 Nginx 的 stream 模块实现四层 TCP/UDP 集群负载均衡,核心是启用模块、独立配置 stream 块、定义 upstream 和 server,并确保后端服务可直连。它不解析应用层数据,只基于 IP 和端口转发,因此延迟低、吞吐高,适合数据库、DNS、游戏等场景。
确认并启用 stream 模块
stream 模块从 Nginx 1.9.0 起提供,但默认不编译进二进制文件:
- 重新 configure 时添加 --with-stream 参数(如已有线上环境,建议先在从机测试)
- 执行 make(切勿
make install,避免覆盖配置和旧二进制) - 用
nginx -V 2>&1 | grep -o with-stream验证是否已启用 - 若确认启用,替换 nginx 二进制文件后执行
nginx -s reload生效
编写标准 stream 配置结构
stream 是与 http 同级的顶级块,不可嵌套在 http 内:
- 在 stream { } 块中定义 upstream,列出后端真实地址(必须带端口),支持
weight、max_fails、fail_timeout -
server 块监听客户端请求端口(如 3306、53、8443),通过
proxy_pass指向 upstream 名称 - TCP 场景设
proxy_timeout控制空闲超时;UDP 场景需显式写listen 53 udp;,且每个 server 块仅支持一种协议 - 如需透传客户端真实 IP,加
proxy_protocol on;(下游服务须支持 PROXY 协议)
适配不同业务类型的关键配置
不同协议和服务对配置有特定要求:
- MySQL/PostgreSQL 等数据库:推荐长连接,设置
proxy_connect_timeout 3s、proxy_timeout 120s,搭配health_check interval=5s fails=2 passes=2 port=3306(需 Nginx ≥1.11.5) - DNS 或 Syslog 等 UDP 服务:必须声明
udp,注意 UDP 无连接状态,不保证顺序,适合无状态查询 - 备份节点配置:在 upstream 中用
backup标记,仅当其他节点全部失效时启用 - 共享内存区域:对高并发集群,可加
zone mysql_zone 64k;支持动态健康检查与状态同步
避开常见配置陷阱
这些细节容易被忽略,却直接影响稳定性:
- stream 不支持 SSL 终止——TLS 流量只能透传,不能配置
ssl_certificate;需前置 TLS proxy 或用七层处理 - 无法基于 URL、Header、Cookie 路由,这是四层本质限制,不是配置错误
- upstream 中每个
server的端口必须显式写出,不可省略 - listen 指令统一决定协议类型,不能为同一 server 下的不同 server 行单独指定 TCP/UDP











