测试加权轮询需批量请求(≥100次)、去缓存(加Cache-Control: no-cache)、禁用连接复用(Connection: close或proxy_set_header Connection ''),统计各后端返回标识频次,与理论比例(如5:3:2→50%:30%:20%)比对,偏差超±8%需排查健康检查或后端异常。

测试加权轮询分配比例是否准确,不能靠手动 curl 几次或看日志片段——那样看不出真实分布。关键在于控制变量、批量请求、去缓存、隔离连接,并用统计验证。
用批量脚本+无缓存请求做基础验证
在一台干净的测试机上执行循环请求,避免浏览器或代理干扰:
- 加 Cache-Control: no-cache 头:curl -H "Cache-Control: no-cache" http://nginx-ip/
- 用 shell 循环发 100 次以上请求(少于 100 次偏差大):
for i in {1..200}; do curl -s http://nginx-ip | grep server_id; done - 每台后端返回唯一标识(如
Server: app-A),方便后续统计频次
注意连接复用对结果的干扰
keepalive 会让多个 HTTP 请求复用同一个 TCP 连接,全部落到同一台后端,导致权重失真:
- 测试时在 upstream 或 location 中临时关闭复用:
proxy_http_version 1.1;
proxy_set_header Connection ''; - 或者直接在测试请求里加 Connection: close 头:
curl -H "Connection: close" http://nginx-ip - 生产环境不要长期关 keepalive,仅测试时启用上述措施
比对理论值与实际统计结果
Nginx 的加权轮询不是严格实时按比例切分,而是基于“加权轮询队列”的周期性调度。小样本容易偏差,需看整体趋势:
- 例如配置
weight=5、weight=3、weight=2,理论占比应为 50% : 30% : 20% - 200 次请求中,各节点返回次数分别接近 100、60、40 才算基本达标
- 若某节点占比持续偏离超 ±8%,需检查是否有健康检查剔除、max_fails 触发、或后端主动拒绝请求
上线后盯住真实指标
配置生效后,别只信配置文件,要查运行数据:
- 解析 Nginx access 日志,按 upstream_addr 字段统计各后端请求数占比
- 若有 Prometheus + nginx-exporter,查
nginx_upstream_requests_total{upstream=~".*"}各实例数值 - 结合延迟观察:如果低权重点 P95 延迟是主力节点 2 倍以上,说明它已不堪负荷,权重可能设高了或健康检查没起作用


















