Nginx 中如何利用权重控制实现服务器负载分流

作者:袖梨 2026-07-07
权重控制是Nginx实现差异化流量分发最常用方式,需在upstream中配置weight(相对值,非百分比),配合健康检查(如max_fails=2 fail_timeout=30s)才可靠,仅在加权轮询模式下生效,ip_hash等策略会使其失效,须通过实际请求日志验证效果。

权重控制是 Nginx 实现差异化流量分发最常用也最实用的方式,它不依赖外部模块,直接在 upstream 块中配置即可生效。核心在于理解 weight 是相对值而非绝对百分比,且只在服务器健康时起作用。

权重的基本写法与比例逻辑

upstream 中为每个 server 指定 weight 值,Nginx 会自动归一化计算实际占比:

  • 未写 weight 的服务器默认 weight=1
  • weight=0 表示临时下线,不参与调度也不触发健康检查
  • weight=5、weight=3、weight=2 和 weight=10、weight=6、weight=4 效果完全一样,都是 5:3:2 的比例
  • 三台服务器 weight 分别为 3、1、2,长期来看请求占比约为 50% : 16.7% : 33.3%

权重必须配合健康检查才可靠

单靠 weight 无法应对后端故障。一旦某台服务器因响应超时或返回错误被标记为不可用,它的 weight 就暂停生效,剩余健康节点会按各自 weight 重新归一化分担全部流量:

  • 建议为每个 server 显式添加 max_fails=2 fail_timeout=30s
  • 例如原配置 A(weight=5)、B(weight=3)、C(weight=2),若 C 失败下线,则 A 和 B 按 5:3(即约 62.5% : 37.5%)承接所有请求
  • 不要单独调优 weight,需和 max_failsfail_timeout 联动设置

权重与其他策略不能混用

某些负载均衡策略会覆盖或忽略 weight 设置,使用前需注意兼容性:

  • ip_hash 启用后,weight 完全失效,因为请求必须固定到同一台后端
  • least_connhash $request_uri 等策略本身不基于轮询,weight 不参与调度逻辑
  • weight 只在默认的加权轮询(weighted round-robin)模式下有效

验证权重是否生效的实用方法

配置完成后不能仅凭理论判断,需通过实际请求分布来确认:

  • 执行 nginx -t && nginx -s reload 生效配置
  • 在后端服务 access log 中记录 $http_x_forwarded_for 或自定义 header(如 X-Upstream-Addr
  • ab -n 1000 -c 100 http://domain/ 发起批量请求,统计各节点日志请求数
  • 观察一段时间(几百到上千请求)后的实际比例,应趋近设定权重比

相关文章

精彩推荐