Nginx的stream模块是实现TCP/UDP四层负载均衡的核心组件,不解析应用层协议,仅基于IP和端口转发,性能高、延迟低,适用于MySQL等长连接场景;需编译启用--with-stream,配置独立于http块,通过stream{upstream{}server{}}结构实现。

确认 stream 模块已启用
该模块从 Nginx 1.9.0 引入,但默认不编译进二进制文件:
- 重编译时加 --with-stream 参数,例如:
./configure --with-stream - 运行中验证:执行
nginx -V 2>&1 | grep with-stream,有输出即已支持 - 若线上环境未启用,可仅替换 nginx 二进制文件 +
nginx -s reload,无需全量重启
定义 upstream 组:适配业务连接特性
TCP 长连接场景下,轮询容易导致节点连接数严重不均,需针对性配置:
- 用 least_conn 算法,新连接优先落到当前活跃连接最少的后端
- 节点性能差异大时加 weight,如高配机器设
weight=3,普通机器保持默认weight=1 - 关键服务必须配 backup 实例,主节点异常时自动接管流量
- 多 worker 进程下必加 zone,例如
zone tcp_pool 64k,否则连接数统计不同步,负载失衡 - 基础健康检查靠 max_fails 和 fail_timeout,如
max_fails=3 fail_timeout=30s表示连续失败 3 次后,30 秒内不发流量
配置 server 块:监听与透传要精准
server 负责对外暴露端口,并把原始 TCP 流干净地甩给 upstream:
-
listen 必须写明端口,如
listen 3306;;UDP 需显式加udp,如listen 53 udp; -
proxy_pass 后只写 upstream 名,不能带协议或路径,例如
proxy_pass mysql_cluster;(不是tcp://) - proxy_connect_timeout 设为 1–3 秒,快速感知后端宕机
-
proxy_timeout 设为业务最大空闲等待时间,如
proxy_timeout 1h;,防止被防火墙或中间设备断连 - 如需透传客户端真实 IP,下游服务得支持 PROXY 协议,此时加
proxy_protocol on;
部署注意事项:避开常见坑
配置写对只是起点,实际跑稳还得注意这些硬性约束:
-
stream 是顶级块,和 http 平级,不能塞进
http{}里,否则 nginx 启动直接报错 - 不支持 SSL 终止——TLS 流量只能原样透传;想卸载证书,得前置 TLS proxy 或换七层方案
- 不能按 URL、Header、Cookie 分流,这是四层的本质限制,不是配置没写对
- upstream 中每个
server行必须带端口,不能省略;协议类型由listen统一决定,不支持 per-server 协议指定


















