直接用curl加计数脚本模拟多次请求并统计后端实际接收数,是最简单有效的Nginx轮询验证方式;通过启动双节点带X-Server-Id标识的服务、配置纯轮询upstream、循环100次请求并提取响应头汇总,可直观检验分发是否均衡,偏差大时需排查keepalive复用、后端超时或fail_timeout影响。

直接用 curl + 计数脚本 模拟多次请求,再统计后端服务实际收到的请求数,是最简单有效的验证方式。
准备带日志的后端服务
确保每个后端节点(如 8080、8081)能独立记录访问日志,或返回可识别的身份标识(比如响应头 X-Server-Id: node-a)。不需要复杂日志系统,一行一个请求时间+端口即可:
python3 -c "from http.server import *; class H(SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200); self.send_header('X-Server-Id', 'node-a'); self.end_headers(); self.wfile.write(b'ok')" -p 8080
python3 -c "from http.server import *; class H(SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200); self.send_header('X-Server-Id', 'node-b'); self.end_headers(); self.wfile.write(b'ok')" -p 8081
配置 Nginx 轮询 upstream
在 nginx.conf 中定义最简轮询组(不加 weight、ip_hash 等干扰项):
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
location / { proxy_pass http://backend; }
}
发起批量请求并统计分发结果
用 curl 循环调用 Nginx 入口,提取响应头中的 server 标识,汇总计数:
- 执行 100 次请求:
for i in {1..100}; do curl -sI http://127.0.0.1/ | grep "X-Server-Id" | tr -d '\r'; done | sort | uniq -c - 预期输出接近:
50 X-Server-Id: node-a和50 X-Server-Id: node-b - 若偏差较大(如 65/35),检查是否启用了 keepalive 导致连接复用、后端响应慢引发队列堆积,或 Nginx 缓存了 upstream 状态
注意真实场景下的干扰因素
轮询是按连接/请求顺序分发,但实际均分受以下影响:
- 客户端复用 TCP 连接(HTTP/1.1 默认 keep-alive)→ 同一连接后续请求仍打到同一后端
- 某后端响应慢或超时 → Nginx 临时标记为不可用,跳过该节点几秒(默认 fail_timeout=10s)
- 没有启用
least_conn或健康检查时,轮询本身不感知后端负载


















