Nginx upstream默认轮询,不加weight即等权重轮询;加weight实现加权轮询,权重为相对比例,需结合健康检查(max_fails/fail_timeout)和真实负载设定,并reload生效。

upstream 块里写 server 行,不加 weight 就是轮询,加了就是加权轮询——这是最直接有效的配置方式,不需要额外模块或重启整个 Nginx 服务。
轮询(Round Robin)怎么配才真正生效
轮询是 Nginx 默认策略,只要 upstream 里多个 server 行没带 weight、backup、down 等修饰,就自动启用轮询。
- 请求按顺序分发:第1个到第1台,第2个到第2台,第3个到第3台,第4个回到第1台……循环往复
- 每台服务器默认
weight=1,所以实际是「等权重轮询」 - 如果某台服务器响应慢或超时,Nginx 不会自动跳过它——必须显式配置健康检查,否则用户会卡在等待上
- 建议加上
max_fails=3 fail_timeout=30s,例如:server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;,这样连续失败3次后,30秒内不再转发请求过去
加权轮询(Weighted Round Robin)的 weight 参数怎么设才合理
weight 不是百分比,而是相对比例;Nginx 内部用「加权轮询算法」计算分配节奏,不是简单按比例截断取整。
- 比如三台:
server 192.168.1.101 weight=3;、server 192.168.1.102 weight=2;、server 192.168.1.103 weight=1;,总权重为6,理论分配比是 3:2:1,即 50% : 33.3% : 16.7% - 权重值建议基于真实指标设定:CPU 核数、内存容量、历史平均 QPS 或 p95 响应时间反比——别凭感觉填 10 和 1
-
weight只影响新连接的初始分发,不影响已建立的长连接(如 WebSocket、HTTP/2 流) - 权重不能为 0;设成
down才是临时下线,backup是仅当其他全挂时才启用
轮询和加权轮询共存时的行为容易被忽略
同一个 upstream 块里可以混用带 weight 和不带 weight 的 server 行,Nginx 会统一归一化处理。
- 未指定
weight的服务器,统一按weight=1计算 - 例如:
server a weight=4;+server b;+server c;→ 实际权重比是 4:1:1,a 承担 66.7% 请求 - 但这种写法容易引发误判——运维看配置以为 b/c 是“默认均等”,其实它们共同只占 1/3 流量。建议显式写出所有
weight值,保持可读性 - 权重变化后,需执行
nginx -s reload生效;旧连接仍走原路径,新连接立即按新权重分配
轮询看着简单,但没配健康检查就等于裸奔;加权轮询的 weight 值一旦脱离实际负载能力,反而会把压力引向瓶颈节点。真正关键的不是怎么写那几行配置,而是怎么验证——用 curl 轮着调、看 access log 时间戳间隔、对比各后端的 $request_time,才能确认流量真的按你预期在跑。











