加权轮询是Nginx优化异构集群负载的核心机制,通过基于性能实测的静态权重(如5:2:3)分配请求,配合health_check实现故障自动剔除与权重再平衡,支持热更新且不中断服务。

加权轮询(Weighted Round Robin)是 Nginx 针对异构服务器集群最直接有效的资源利用率优化手段。它不依赖实时监控或复杂插件,仅通过静态权重配置,就能让高性能节点承担更多请求,低配节点不被压垮,从而在不增加运维成本的前提下显著提升整体吞吐与稳定性。
明确服务器性能差异再设权重
权重不是拍脑袋定的,得有依据。常见做法是参考 CPU 核心数、内存容量或压测 QPS 比值。比如两台机器:一台 8C16G(实测稳定承载 3000 QPS),一台 4C8G(实测上限 1200 QPS),它们的性能比约为 2.5:1,可初步设为 weight=5 和 weight=2。Nginx 不要求权重必须归一化,只看比例关系。
- 避免设成 weight=100 和 weight=40——数值过大可能在日志或监控中造成误读
- 若新增一台同规格 8C16G 机器,直接复用 weight=5 即可,保持比例一致
- 权重设错不会导致服务中断,但会放大负载失衡;建议上线前用 ab 或 wrk 做小流量验证
在 upstream 块中正确配置 weight 参数
权重必须写在 server 指令行末尾,且不能和 backup、max_fails 等参数混用在同一行(除非用空格分隔)。典型配置如下:
upstream app_cluster {
server 192.168.1.10:8000 weight=5;
server 192.168.1.11:8000 weight=2;
server 192.168.1.12:8000 weight=3;
}
- 未显式写 weight 的服务器,默认 weight=1
- 权重总和不影响算法逻辑,Nginx 内部按比例归一化计算
- 支持与 health_check 指令共存,故障剔除后,剩余节点仍按权重比例继续分发
结合健康检查防止“带病权重”
光有权重不够,如果某台高权重大机宕机却不自动下线,流量还会持续打过去,造成失败率飙升。必须启用主动健康检查:
upstream app_cluster {
server 192.168.1.10:8000 weight=5;
server 192.168.1.11:8000 weight=2;
server 192.168.1.12:8000 weight=3;
health_check interval=5 fails=3 passes=2;
}
- interval=5 表示每 5 秒探测一次
- fails=3 是连续失败 3 次才标记为不可用
- passes=2 是恢复后需连续两次成功才重新加入流量池
- 该功能依赖 ngx_http_upstream_hc_module,在主流发行版 Nginx 1.13+ 中默认编译启用
观察效果并动态微调权重
上线后别只盯平均响应时间,重点看各节点的 实际请求数占比 和 CPU 使用率曲线 是否趋近理论权重比。例如三台机器权重为 5:2:3,理想请求分配应接近 50% : 20% : 30%。
- 用 nginx stub_status 或 Prometheus + nginx-vts-exporter 抓取各 upstream server 的 request counter
- 若发现 weight=5 的机器 CPU 长期 >90%,而 weight=2 的才 40%,说明权重偏高,可下调至 4 或 3
- 调整权重无需 reload 全局配置,支持热更新:修改配置 → nginx -t → nginx -s reload


















