加权轮询需结合实测吞吐量设定相对权重(如1200:300→weight=4:1),并强制搭配健康检查(max_fails=3 fail_timeout=30s),响应时间差异大时应改用least_conn+重试机制,部署后须通过x-upstream-addr或access_log验证实效。

轮询算法本身不感知后端处理能力差异,它只按顺序分发请求。想在性能不均的后端间实现合理均衡,不能只靠默认轮询,必须结合权重、健康检查和连接策略来调节流量分布。
加权轮询是基础调节手段
weight 参数不是“算力权重”,而是请求计数比例。它的作用是让高性能节点多接请求,低性能节点少接请求。关键在于权重要基于实测数据设定:
- 用 wrk 或 ab 对每台后端单独压测,获取稳定吞吐量(如 A:1200 req/s,B:300 req/s),按比值设 weight=4 和 weight=1
- 若按硬件配置粗估,可参考 CPU 核心数比(如 16C:8C:4C → weight=4:2:1)
- weight 是相对值,4:1 和 8:2 效果完全一致,避免使用过大或无意义的数值(如 weight=99)
必须搭配健康检查机制
没有健康检查的权重配置是脆弱的。一台后端响应变慢或卡死,Nginx 仍会按原比例继续派发新请求:
- 每个 server 行需加上 max_fails=3 fail_timeout=30s,表示连续 3 次失败(超时/5xx)后暂停转发 30 秒
- fail_timeout 过期后,Nginx 会试探性恢复转发,成功则重新纳入轮询池
- 该机制确保权重只在“当前健康”的节点间生效,避免流量打到已失能的实例上
对响应时间敏感的场景建议换策略
如果后端 RT 差异大(比如有的接口平均 20ms,有的常达 800ms),纯轮询或加权轮询容易造成请求堆积。此时应考虑:
- least_conn:优先发给当前活跃连接最少的后端,适合长连接或耗时不稳定的服务
- 配合 proxy_next_upstream error timeout http_500 http_502,让失败请求自动重试其他节点
- 设置合理的超时参数:proxy_connect_timeout 5s、proxy_read_timeout 30s,防止慢节点拖垮整体
验证是否真正生效
部署后别只看配置,要实际观察流量分配效果:
- 在 proxy_pass 后添加 proxy_set_header X-Upstream-Addr $upstream_addr;,然后用 curl -I 多次请求,查看响应头中实际转发的目标地址
- 开启 Nginx access_log 的 upstream_addr 字段,统计各后端接收请求数,确认比例是否接近预设权重
- 模拟某台后端宕机,观察日志是否停止向其转发,并在 fail_timeout 后自动恢复试探











