Nginx轮询通过固定顺序指针循环分发请求,实现均匀分流;关键需清除weight、ip_hash等干扰项,统一健康检查参数,并用日志验证长期分布偏差≤3%。

Nginx 的轮询模式(Round Robin)是实现后端请求分担最直接、最轻量的方式,它不依赖外部组件或实时状态采集,靠顺序循环调度达成基本均衡。实际效果是否“均匀”,取决于配置干净度与后端稳定性,而非算法本身复杂度。
轮询是怎么分配请求的
它维护一个指向当前服务器的指针,每次新请求到来时:发给指针所指服务器 → 指针移到下一台 → 到末尾则回到开头。比如三台服务器 A、B、C,请求流向就是 A→B→C→A→B→C……如此循环。
这个过程无状态、不查负载、不比响应时间,只认配置顺序和可用性。只要没人为干预,长期统计下来各节点请求数非常接近。
让轮询真正均匀的关键条件
- 所有 server 行不带 weight 参数:加了 weight 就变成加权轮询,均等性被打破
- upstream 块中不启用 ip_hash、hash $uri、least_conn 等其它算法指令
- 后端服务器性能和响应能力相近:若某台处理慢或频繁超时,会被快速标记为不可用,导致剩余节点承接更多流量
- 配置基础容错:如 max_fails=2 fail_timeout=15s,让故障节点及时退出轮询队列,避免持续拖累整体均衡性
轮询配置里容易忽略的细节
看似简单,但几处小改动会实质性影响分担效果:
- server 行末尾加 down:用于主动下线维护中的节点,Nginx 会跳过它继续轮询,不影响其余节点节奏
- 启用 keepalive:在 upstream 中加 keepalive 32,复用连接,减少后端建连开销,尤其对短连接高频场景明显提升吞吐
- 健康检查建议搭配使用:http 模块可配 health_check interval=5s,stream 模块也支持;比仅靠 max_fails 更主动、更及时
怎么验证轮询是否生效
别只看配置,动手验证更可靠:
- 用 curl 循环发起请求,配合响应头(如自定义 Server: backend-01)观察是否按预期交替返回
- 检查每台后端 access.log 的请求计数,跑够 100+ 次后对比差异是否在 ±5% 内
- 临时停掉其中一台服务,确认 Nginx 错误日志出现 connect refused,且其余节点日志请求量自动补足


















