Nginx轮询算法仅保证请求层面的顺序均匀分发,不保障资源或负载公平;其公平性依赖后端节点性能相近、配置干净无weight/ip_hash等干扰、健康检查参数统一,长期统计偏差≤3%。

Nginx 的轮询算法本身不“保证”公平性,它只提供请求层面的顺序分发。真正的公平性取决于后端节点是否处于可比、可控、可预期的状态。
轮询的公平性本质是统计意义上的均匀,不是实时负载感知
轮询按固定顺序循环分配请求(A→B→C→A…),长期来看请求数基本一致。但它不看 CPU 使用率、响应耗时或连接数——哪怕某台服务器处理慢一倍,只要没超时或失败,它仍会照常被轮到。所以公平性仅体现在“请求计数”上,而非“资源消耗”或“服务耗时”上。
让轮询表现出公平性的三个硬性前提
- 节点性能相近:各服务器的硬件配置(CPU/内存)、应用逻辑复杂度、依赖服务响应速度应基本一致;否则相同请求数 ≠ 相同负载压力
- 配置干净无干扰:upstream 块中所有 server 行必须只含地址和端口,不能带 weight、ip_hash、backup、down 或 max_conns 等参数,否则轮询逻辑会被覆盖或打乱
- 健康检查策略统一:为每台 server 显式配置相同的 max_fails=2 fail_timeout=15s,避免因探测差异导致某台被反复剔除,破坏轮询队列完整性
异常节点如何影响公平性?
轮询本身无状态,但配合基础健康检查后具备临时容错能力:
- 某台连续失败达 max_fails 次,会在 fail_timeout 时间内被跳过,后续请求自动绕行
- 该节点恢复后自动回归轮询队列,无需人工干预或 reload 配置
- 这种摘除是临时的,不影响整体长期均衡——只要故障是偶发且恢复及时,统计偏差通常 ≤3%
验证公平性最可靠的方式是查 upstream 日志
别依赖监控图表或平均响应时间,直接看 Nginx 记录的实际转发目标:
- 定义日志格式: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…)











