要用 stream_upstream_module 实现 tcp 协议的加权轮询负载均衡,核心是正确启用 stream 模块、在顶层 stream 块中定义 upstream,并为每个后端 server 显式设置 weight 参数。

要用 stream_upstream_module 实现 TCP 协议的加权轮询负载均衡,核心是正确启用 stream 模块、在顶层 stream 块中定义 upstream,并为每个后端 server 显式设置 weight 参数。它不依赖应用层信息,只按权重比例分发新建 TCP 连接。
确认并启用 stream 模块
Nginx 默认不编译该模块,必须手动启用:
- 重新 configure 时添加
--with-stream参数(如:./configure --with-stream) - 执行
make(不要make install,避免覆盖线上配置) - 用
nginx -V 2>&1 | grep -o with-stream验证输出是否含with-stream - 若已运行旧版,替换二进制文件后执行
nginx -s reload
编写加权轮询 upstream 配置
在 nginx.conf 顶层(与 http 块同级)添加 stream 块,例如:
stream {
upstream tcp_backend {
server 192.168.10.10:8080 weight=5;
server 192.168.10.11:8080 weight=3;
server 192.168.10.12:8080 weight=2;
}
server {
listen 8080;
proxy_pass tcp_backend;
proxy_timeout 30s;
}
}
说明:
- 权重值为整数,代表相对分配比例(如 5:3:2 表示三台服务器接收连接的比例)
- 未写
weight的 server 默认为weight=1 - 加权轮询是默认算法,无需额外声明
round_robin - 所有
server行必须带端口,不可省略
配合健康检查提升稳定性
加权轮询本身不自动剔除故障节点,需叠加基础或主动健康检查:
- 基础被动检查:在
server行后加max_fails=3 fail_timeout=30s,连续失败 3 次则暂停转发 30 秒 - 主动探测(Nginx ≥ 1.11.5):使用
health_check指令,例如对 MySQL 可发握手包:health_check interval=5s fails=2 passes=2 port=3306; - 注意:TCP 主动检查依赖三次握手成功,UDP 则需搭配
match块模拟响应校验
关键限制与避坑提醒
加权轮询在 stream 层有明确边界,部署前需确认:
- 不支持 TLS 终止——加密流量只能透传,不能卸载证书
- 无法基于 URL、Header、Cookie 或请求内容做路由,纯 IP+端口转发
- 不维护应用层会话状态,加权仅作用于新建立的 TCP 连接,已有连接不受影响
- 日志需单独开启:
access_log /var/log/nginx/stream-access.log;,位置在server块内











