nginx实现tcp负载均衡的核心是启用stream模块,在四层不解析应用层协议,直接转发连接,适用于聊天、数据库、mq等长连接场景;需编译时含--with-stream、stream块与http同级、配置upstream及server监听端口并设proxy_timeout等参数保障稳定性。

Nginx 实现后端集群的 TCP 流量负载均衡,核心是启用 stream 模块,在四层(传输层)完成连接转发,不解析应用层协议,适合聊天服务、数据库代理、消息队列等长连接场景。
确认并启用 stream 模块
必须确保 Nginx 编译时已开启 --with-stream。验证方式:
- 运行
nginx -V 2>&1 | grep -o with-stream,输出with-stream表示已支持 - 若未启用,需重新编译:下载源码后执行
./configure --with-stream [其他原有选项],再make && make install - 注意:
stream块与http块同级,不能嵌套在 http 内
定义 TCP 上游服务器池
在 stream 块中配置 upstream,指定后端节点及调度策略:
- 使用
ip_hash保证同一客户端 IP 的 TCP 连接始终落到同一台后端,适用于 WebSocket 或聊天会话类服务 - 用
least_conn应对突发短连接洪峰,避免某节点连接数瞬间飙高 - 为异构节点设置
weight,例如新机器设weight=3,旧机器设weight=1,按实际吞吐能力分摊连接 - 添加健康检查参数:
max_fails=3 fail_timeout=30s,连续失败 3 次则临时摘除,30 秒后自动重试
监听与转发 TCP 连接
通过 server 块暴露入口端口,并将连接透传给 upstream:
-
listen 8000;—— 客户端直连此端口;建议显式加backlog=65535防 SYN 队列溢出 -
proxy_pass chat_servers;—— 转发到前面定义的 upstream 名称 -
proxy_timeout 30m;—— 长连接需设大超时(如聊天服务),避免空闲断连 -
proxy_connect_timeout 5s;—— 控制与后端建连耗时,防止卡死
增强稳定性与过载防护
TCP 层没有 HTTP 的 header 和 status,防护需更侧重连接行为本身:
- 限制单 IP 并发连接数:
limit_conn_zone $binary_remote_addr zone=conn_perip:10m;+limit_conn conn_perip 50; - 启用连接级重试:
proxy_next_upstream error timeout;(TCP 场景下仅支持 error 和 timeout) - 配合系统调优:增大
net.core.somaxconn、net.ipv4.tcp_max_syn_backlog和ulimit -n至 65535 以上 - 压测时用
ss -lnt观察对应端口的Recv-Q,确认 backlog 是否被有效利用











