Nginx加权轮询负载均衡测试需三步:后端服务返回唯一标识、发起足够请求、统计各节点实际请求数;理论分配比为权重比(如3:2:1≈50%:33%:17%),实测允许±3%浮动。

要测试 Nginx 的加权轮询(Weighted Round Robin)负载均衡是否按预期分配流量,核心是:**让后端服务能明确标识自身身份 + 发起足够多次请求 + 统计各节点实际接收请求数量**。下面分步骤说明实用方法。
1. 配置带权重的 upstream 并启用日志记录
在 nginx.conf 中定义 upstream,为每个后端服务器设置不同 weight(如 3、2、1),并确保 access_log 记录到独立文件或带上后端标识:
upstream backend {
server 127.0.0.1:8001 weight=3;
server 127.0.0.1:8002 weight=2;
server 127.0.0.1:8003 weight=1;
}
<p>server {
location / {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_set_header Host $host;</p><h1>记录转发到哪个后端(需配合 log_format)</h1><pre class="brush:php;toolbar:false;"> log_format upstreamlog '[$time_local] $remote_addr "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr"';
access_log /var/log/nginx/upstream_access.log upstreamlog;
}
}
2. 后端服务返回可识别的响应头或内容
让每个后端在响应中带上唯一标识(如 host 名、ID 或权重值),方便验证请求是否真被该节点处理:
- 用 Python Flask 快速启动三个服务(端口 8001/8002/8003),每响应都写入
X-Backend-ID: node1等头 - 或直接返回纯文本:
node1 (weight=3),便于 curl 批量抓取 - 避免使用缓存代理或 CDN,确保请求真实到达 Nginx 负载均衡层
3. 发起批量请求并统计分配结果
用脚本发起几十到几百次请求(避免太少导致随机性干扰),收集后端响应或 Nginx 日志中的 $upstream_addr 字段:
- 简单方式:用 bash + curl 循环 100 次,把响应头保存到文件,再用
grep -o "node[1-3]" | sort | uniq -c统计 - 更准方式:解析 Nginx access log 中的
$upstream_addr(如127.0.0.1:8001),用 awk 统计各地址出现次数 - 理论期望比例 ≈ 权重比(3:2:1 → 约 50% : 33% : 17%),实测允许 ±3% 浮动(受连接复用、请求并发度影响)
4. 注意影响分配准确性的常见因素
加权轮询不是严格按“每 6 次请求固定分 3+2+1”,而是基于连接调度的平滑加权算法(Nginx 默认用 smooth weighted round-robin),所以需关注:
- 单个长连接(如 HTTP/1.1 keepalive)可能多次复用同一后端,建议用短连接测试(curl 加
-H "Connection: close") - 避免后端健康检查失败或
max_fails触发临时摘除,检查nginx -t && nginx -s reload后状态 - 确认没开启
ip_hash或hash $request_uri等其他负载策略,它们会覆盖 weight 行为











