nginx加权轮询通过upstream中weight参数分配请求比例,如weight=5、3、2对应50%、30%、20%占比,按加权序列调度并支持max_fails/fail_timeout健康检查,需重载配置并用curl脚本验证。

在 Nginx 中配置加权轮询(Weighted Round Robin),核心是通过 upstream 块中的 weight 参数,为性能不同的后端服务器分配处理请求的比例,从而让高配机器多扛流量、低配机器少分担——这是适配异构服务器最直接有效的做法。
加权轮询的配置写法
在 http 块中定义 upstream 组,每个 server 行后加上 weight=数字:
upstream backend {
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080 weight=3;
server 192.168.1.103:8080 weight=2;
}
这里权重总和为 10,三台服务器的理论请求占比分别是 50%、30%、20%。Nginx 不做实时概率采样,而是按“加权轮询序列”调度,例如上述配置典型调度顺序为:101→101→102→101→102→103→101→102→103→101……循环展开后整体比例趋近于权重比。
配合健康检查提升稳定性
异构环境更需保障可用性,避免低配节点故障拖垮整体。建议为每个 server 显式添加容错参数:
-
max_fails=3:连续失败 3 次则标记为不可用 -
fail_timeout=30s:30 秒内不向该节点转发请求 - 可组合使用,如:
server 192.168.1.103:8080 weight=2 max_fails=2 fail_timeout=20s;
注意:Nginx 默认只做 TCP 层探活;若需 HTTP 层健康检查(比如检测应用返回 5xx),需搭配第三方模块(如 nginx_upstream_check_module)或外部监控+动态配置管理。
验证是否生效的实操方法
不依赖日志轮查,快速确认权重是否起作用:
- 用脚本发起 20–30 次请求:
for i in {1..30}; do curl -s http://nginx-lb/ | head -n1; done - 统计各后端响应字符串出现次数(如 "server1" / "server2")
- 观察比例是否接近权重比(允许小幅波动,因 Nginx 调度非严格按批分配)
若结果严重偏离(如全打到一台),检查:配置是否重载(nginx -s reload)、端口连通性、后端服务是否正常返回 HTTP 200。
与轮询策略的关键区别提醒
加权轮询不是“每轮固定发 N 个给 A、M 个给 B”,它仍保持轮询骨架,只是按权重扩展循环周期。这意味着:
- 权重为 1 的服务器不会被跳过,只是频率更低
- 所有 server 必须显式写 weight,不写等价于
weight=1,容易误判“没生效” - 权重值无上限,但建议控制在 1–10 整数区间,便于理解和维护
只要后端服务能力差异明显(比如 CPU 核心数相差 2 倍以上),加权轮询就能显著改善负载倾斜问题。











