验证加权轮询需发起串行请求并统计后端实际响应次数,关键看真实请求分布而非配置权重;应为每台后端设置唯一标识(如X-Server-ID),禁用keepalive、缓存及哈希策略,确保请求严格串行,再通过响应头或日志统计分配比例,注意健康状态对权重生效的影响。

直接发起足够数量的串行请求,再统计各后端实际响应次数,就能验证加权轮询是否按预期比例分发流量。关键不是看配置是否写了 weight,而是看真实请求到底落在哪台机器上。
准备可识别的后端标识
每台后端服务需返回唯一标识,便于归因。推荐方式:
- 在响应头中添加 X-Server-ID,值为服务器 hostname 或自定义 ID(如
X-Server-ID: node-a) - 若无法改响应头,可在响应体中固定输出字符串(如
{"server": "node-b"}),后续用文本提取 - 确保所有节点启用访问日志,并记录来源 IP 和时间戳,用于交叉核对
发起无干扰的测试请求
避免连接复用、缓存、哈希策略等干扰轮询逻辑:
- 用 ab -c 1 -n 1000(并发 1,总 1000 次)或 wrk -c1 -d10s --latency,保证请求严格串行
- 禁用 keepalive:在 upstream 块中显式设置
keepalive 0,防止单连接复用导致连续打到同一台 - 绕过缓存:每次请求加随机参数(如
?t=1727816461)或请求头Cache-Control: no-cache - 确认未启用
ip_hash、hash $request_uri等非轮询策略——即使配置被注释,也要检查生效配置(用nginx -T输出确认)
统计并比对实际分配比例
收集响应后,提取标识字段做频次统计:
- 用 curl + awk 快速验证(示例):
for i in {1..1000}; do curl -s http://your-nginx/ | grep "X-Server-ID" | awk '{print $2}'; done | sort | uniq -c | sort -nr - 更可靠的方式是解析各节点的 access.log:
awk '{print $13}' /var/log/nginx/backend/node-a-access.log | wc -l(假设 $13 是客户端 IP 或标识字段) - 计算占比:若三台权重设为 5:3:2,总权重 10,理论应得 500、300、200 次(1000 请求下);实测偏差超过 ±5% 就需排查
注意健康状态对权重分配的影响
weight 只在节点状态为 up 时生效。以下情况会导致实际比例偏移:
- 某台 server 因
max_fails触发临时摘除,即使只超时一次,也会在fail_timeout内不参与调度 - 使用
slow_start时,新上线节点权重会从 0 逐步恢复,初期承接请求极少 - 建议测试前执行
curl -s http://localhost/status(若启用了 stub_status)或查看nginx -T | grep -A 10 "upstream"确认所有 server 当前状态为 up


















