nginx tcp代理(stream模块)原生不支持weight参数,因工作在传输层,仅支持轮询、least_conn、hash等无权重策略;替代方案包括重复声明服务器地址模拟权重、dns加权解析或升级nginx plus。

Nginx 的 TCP 代理(四层代理)本身不支持 weight 参数——这是关键前提。与 HTTP 反向代理(七层)不同,stream 模块下的 upstream 不识别 weight=、max_fails、fail_timeout 等参数,直接配置会报错或被忽略。
TCP 代理权重不可用,但有替代方案
stream 模块仅支持以下几种调度策略:
- 轮询(round-robin):默认策略,请求按顺序均分到各节点,无法按比例控制
- least_conn:将新连接发给当前活跃连接数最少的后端,适合长连接场景
- hash $remote_addr:基于客户端 IP 哈希,保证同一 IP 总连同一台后端(类似 ip_hash)
- hash $server_addr 或其他变量:需确保哈希源稳定,否则失去一致性
这些策略都不接受 weight 参数。试图在 stream upstream 中写 server 10.0.0.1:3306 weight=3; 会导致 Nginx 启动失败(语法错误)或静默忽略 weight。
实现近似“权重效果”的可行做法
若必须让某台 TCP 后端接收更多流量,可借助以下间接方式:
-
重复声明同一地址:在 upstream 中多次列出性能更强的节点,例如:
upstream mysql_cluster {<br> server 10.0.0.1:3306;<br> server 10.0.0.1:3306;<br> server 10.0.0.2:3306;<br>}
这样 10.0.0.1 会获得约 2/3 流量(3 个 slot 中占 2 个),本质是利用轮询的 slot 分配模拟权重 - 结合 DNS 轮询或外部负载均衡器:在 upstream 中配置一个域名,该域名解析为多个 A 记录(含不同权重的 IP),由 DNS 层实现加权分发(依赖 DNS 服务商支持 SRV 或加权 A 记录)
-
使用 nginx-plus 或商业版:官方付费版支持 stream 模块的
weight和健康检查,开源版不提供
正确配置 TCP 代理的基本结构
确保已启用 --with-stream 编译选项,并在主配置中包含 stream 块:
stream {<br> upstream mysql_backend {<br> least_conn;<br> server 10.0.0.1:3306;<br> server 10.0.0.2:3306;<br> }<br><br> server {<br> listen 3306;<br> proxy_pass mysql_backend;<br> proxy_timeout 1s;<br> proxy_responses 1;<br> }<br>}
注意:proxy_pass 后必须引用 upstream 名称(无协议、无端口),且整个 stream 块需位于 http 块之外、顶层作用域下。
验证与注意事项
配置完成后务必执行:
-
nginx -t检查语法(尤其注意 stream 块位置和 server 地址格式) -
nginx -s reload生效配置 - 用
telnet或nc连接代理端口,观察是否实际命中预期后端 - 后端服务需开启对应端口监听,且防火墙放行;Nginx 本机需能直连后端 IP:PORT
开源 Nginx 的 TCP 代理功能简洁可靠,但不提供权重分配能力。需要精细流量控制时,建议评估升级 nginx-plus、改用 LVS/HAProxy,或在应用层做路由分流。











