核心是启用stream模块、合理配置upstream算法与健康检查、精准设置server监听与超时参数。需确认nginx编译含--with-stream,upstream用least_conn+weight+backup+zone,server中listen明确端口、proxy_pass直指upstream名,proxy_connect_timeout设1–3秒、proxy_timeout设长时如1h,并注意stream与http平级、不支持SSL终止和七层分流。

直接用 stream 块配置 TCP 集群,核心是让连接分发合理、故障切换及时、长连接稳定。它不看请求内容,只管 IP 和端口,所以配置简洁但关键参数不能错。
确认 stream 模块已启用
Nginx 默认不编译这个模块,得手动加进去:
- 重装或升级时加上
--with-stream参数(如:./configure --with-stream) - 运行中验证:执行
nginx -V 2>&1 | grep with-stream,有输出说明已支持 - 若未启用,仅替换二进制文件 +
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 块:监听与透传要精准
对外暴露端口、把连接干净地甩给 upstream:
-
listen必须写明端口,如listen 3306;;TCP/UDP 不混用,UDP 要显式加udp,如listen 53 udp; -
proxy_pass后只写 upstream 名字,不能带协议或路径,比如proxy_pass mysql_cluster;(不是tcp://...) -
proxy_connect_timeout设短些(1–3 秒),快速发现后端宕机;proxy_timeout设长些(如1h),避免空闲连接被防火墙或中间设备断开 - 如需透传客户端真实 IP,下游服务得支持 PROXY 协议,此时加
proxy_protocol on;
部署与避坑要点
配置写对只是第一步,实际跑稳还得注意这些:
- stream 是顶级块,和 http 平级,不能塞进 http {} 里,否则启动报错
- 不支持 SSL 终止——TLS 流量只能原样透传;想卸载证书,得前置 TLS proxy 或换七层方案
- 不能按 URL、Header、Cookie 分流,这是四层的本质限制,不是配置没写对
- upstream 中每个
server行必须带端口,不能省略;协议类型由listen统一决定,不支持 per-server 协议指定 - UDP 场景无连接状态,不保证顺序,适合 DNS、Syslog 类无状态协议,不适合强会话依赖的服务



















