轮询是否生效可通过串行curl多次请求并观察X-Upstream-Addr响应头是否按预期轮转来验证;需注意worker进程导致的局部不均,长期统计应接近均匀分布,配合日志和健康检查排除干扰。

直接发起多次请求,观察后端响应来源是否按顺序切换,就能验证轮询是否生效。关键不是看“绝对均匀”,而是看整体分发是否呈现可预期的轮转规律。
用 curl 快速验证轮询顺序
在命令行中连续执行带头信息的请求,最简单有效:
- 先确保 Nginx 配置中已添加 proxy_set_header X-Upstream-Addr $upstream_addr;(放在 location 的 proxy_pass 后面)
- 执行:curl -I http://your-domain/api/test(或任意能快速响应的接口)
- 重复 6–10 次,记录每次响应头里的 X-Upstream-Addr 值
若看到类似 192.168.1.10:8080 → 192.168.1.11:8080 → 192.168.1.10:8080 → … 的交替模式,说明轮询正在工作。
注意 worker 进程带来的“局部不均”现象
Nginx 每个 worker 独立维护轮询计数器,高并发下多个请求可能被同一 worker 处理,导致短时间看起来“卡在某台服务器”。这不是配置错误,而是设计使然:
- 单次测试建议用串行 curl(避免并发干扰)
- 长期统计(如 100 次请求)应接近 1:1 分布(两节点)或 1:1:1(三节点)
- 若始终只打到一台,检查 upstream 是否只写了一个 server,或 proxy_pass 地址拼写错误
配合日志确认真实转发路径
在 Nginx 日志格式中加入 $upstream_addr 和 $upstream_status,能看清每次请求到底去了哪、结果如何:
- 编辑 log_format,例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr" $upstream_status'; - 重启 Nginx 后访问几次,再查
tail -f /var/log/nginx/access.log - 日志末尾会显示类似
192.168.1.10:8080 200或192.168.1.11:8080 502的记录
排除健康检查误判干扰
如果某台后端临时不可达,Nginx 可能因 max_fails 触发临时摘除,造成轮询“跳过”该节点——这属于正常容错行为,但会影响验证效果:
- 验证前先确认所有后端服务正常运行(
curl http://ip:port/health) - 临时注释掉 upstream 中的
max_fails和fail_timeout参数,简化逻辑 - 验证完成后再恢复健壮性配置


















