Nginx TCP层负载均衡默认使用round-robin算法,按顺序将新建连接轮流分发至upstream中定义的后端服务器,仅作用于连接建立阶段,不支持请求级调度或会话保持。

在 Nginx 中,TCP 层的负载均衡(即 stream 上下文)支持多种负载均衡算法,其中 round-robin 是默认且最常用的算法。它不需额外配置即可启用,按顺序将新连接轮流分发到后端服务器。
确认使用的是 stream 模块
Nginx 的 TCP/UDP 代理功能由 ngx_stream_core_module 提供,必须确保编译时启用了该模块(主流发行版预编译包通常已包含)。配置需放在 stream { ... } 块中,而非 http { ... } 块。
- 检查是否支持:运行
nginx -V 2>&1 | grep -o with-stream,输出含with-stream表示可用 - 主配置中需包含
include /etc/nginx/stream.conf;或直接在 nginx.conf 末尾添加stream { ... }
启用 round-robin 负载均衡的最小配置
round-robin 在 upstream 块中为默认策略,无需显式声明 least_conn 或 hash 等关键字。只要定义多个 server,Nginx 就自动按轮询方式调度。
stream {
upstream backend_tcp {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 8000;
proxy_pass backend_tcp;
proxy_timeout 1s;
proxy_responses 1;
}
}
- 每个
server行代表一个 TCP 后端节点,Nginx 按出现顺序依次选择 - 连接建立后保持长连接,round-robin 仅作用于新建连接的分发
- 若某后端不可达,Nginx 默认会跳过它(需配合
max_fails和fail_timeout实现健康检查)
增强 round-robin 的稳定性与可观测性
纯轮询本身无状态,但可通过参数提升容错和可维护性:
- 添加权重:用
weight=2让某节点承接双倍流量,例如server 192.168.1.10:8080 weight=2; - 启用简单健康检查:加
max_fails=3 fail_timeout=30s,连续失败 3 次后 30 秒内不再选该节点 - 记录连接日志:在
server块中添加access_log /var/log/nginx/tcp-access.log;,格式需自定义(stream 日志不复用 http log_format)
注意 round-robin 的常见误区
它不是“请求级”轮询,而是“连接级”轮询 —— 这一点在长连接场景中尤为关键:
- 一个 WebSocket 或数据库连接一旦建立,整个生命周期都绑定到同一后端,不会中途切换
- 如果客户端频繁建连(如短连接 HTTP 代理),轮询效果明显;若连接复用率高(如 Redis/MQ 客户端长连),则流量可能不均
- 不支持 session 持久化(ip_hash 在 stream 中可用,但非 round-robin 行为)










