轮询策略需后端能力一致、配置干净、健康检查统一才能实现压力均衡。应使用同规格节点,upstream仅写地址端口,显式配置一致的max_fails和fail_timeout,并通过日志验证循环分发。

轮询策略本身不主动调节压力,它只是把请求按顺序“轮流派发”给后端节点。真正实现压力均衡,靠的是后端能力一致、配置干净、状态稳定这三件事。
后端节点性能要基本一致
轮询只管分发请求数量,不管每台机器处理快慢。如果某台 CPU 更弱、磁盘更慢或应用响应延迟高,即便请求量相同,它的实际负载也会明显偏高。
- 建议三台服务器使用同型号虚拟机或物理机,部署相同版本的应用和运行时环境
- 避免混用 2C4G 和 4C8G 节点;若必须混用,应改用加权轮询并合理设 weight
- 上线前做压测,确认各节点在同等并发下的平均响应时间与错误率接近
upstream 配置必须保持“干净”
只要加了 weight、ip_hash、least_conn 或 backup/down 标记,就不再是纯轮询,均匀性会被打破。
- 所有 server 行只写地址和端口,例如:server 10.0.1.10:8080;,不要加 weight=1 或 max_fails
- 整个 upstream 块里不能出现 ip_hash、hash $request_uri、least_conn 等指令
- 避免手动加 down 或长期用 backup,否则剩余节点会持续多承接请求,导致失衡
健康检查要统一且及时生效
轮询指针遇到故障节点会自动跳过,但前提是健康检查参数一致,否则有的节点被频繁剔除,有的却一直挂着“假在线”。
- 为每台 server 显式配置相同的探测参数:max_fails=2 fail_timeout=15s
- 不依赖默认值,因为不同 Nginx 版本的默认 max_fails 可能是 1 或 3
- 异常节点被摘除后,会在 fail_timeout 结束后自动回归队列,无需人工干预
验证是否真正在均衡分发
别只看配置有没有写多台 server,得看请求实际落到哪——最直接的方式是查日志。
- 在 http 块定义日志格式:log_format upstream_log '$remote_addr - $upstream_addr [$time_local] "$request" $status';
- 在 location 中启用:access_log /var/log/nginx/upstream.log upstream_log;
- 发起 30+ 次请求(可用 curl 循环或 ab 工具),检查日志中 $upstream_addr 字段是否呈现严格循环序列,如 A→B→C→A→B→C……











