nginx默认启用轮询算法,按配置顺序循环分发请求:第1个请求发给第1台服务器,第2个发给第2台,依此类推,列表末尾后回到开头;该机制依赖内部指针、不看服务器状态、要求无weight参数、无其他算法指令且后端性能相近,并需配合max_fails/fail_timeout实现健康检查。

Nginx 默认启用轮询(Round Robin)算法,不需要任何额外配置,只要定义了 upstream 块并列出后端服务器,就会自动按顺序循环分发请求。
轮询是怎么“轮流点名”的
它靠一个内部指针记住当前该轮到哪台服务器:
- 第 1 个请求 → 发给 upstream 列表里的第 1 台
- 第 2 个请求 → 发给第 2 台
- 第 3 个请求 → 发给第 3 台
- 第 4 个请求 → 列表到底了,指针回到开头,发给第 1 台
这个过程不看响应快慢、连接数或 CPU 使用率,只认配置顺序和指针位置,所以轻量、确定、无状态。
默认配置下分发的关键前提
轮询能均匀分发,依赖三个基础条件:
-
所有 server 行都不带 weight 参数:比如写成
server 192.168.1.10;,而不是server 192.168.1.10 weight=2; - upstream 块里没有其他算法指令:如 ip_hash、hash、least_conn 等必须整行删除,不能只注释
- 后端服务器性能和处理能力接近:如果某台明显更慢或资源更紧张,长期来看可能显得“接得少”,其实是它响应慢导致连接堆积,不是轮询失效
轮询本身不检查健康状态
默认情况下,Nginx 不主动探测后端是否存活。某台宕机后,仍会尝试转发,直到连续失败达到 max_fails 次(默认为 1),并在 fail_timeout 时间内暂停使用该节点。
所以实际生产中建议显式加上健康探测参数,例如:
server 192.168.1.101 max_fails=2 fail_timeout=15s;server 192.168.1.102 max_fails=2 fail_timeout=15s;
这样能避免请求打到不可用节点,保证轮询队列稳定,分发才真正均匀。
怎么验证是不是在轮询
最直接的方式是查 access log,开启 $upstream_addr 变量:
- 在 location 或 server 块里加:
log_format main '$remote_addr - $upstream_addr - $time_local "$request"'; - 重启 Nginx 后发起多个请求,观察日志里
$upstream_addr是否按顺序交替出现
也可以用 curl 循环测试:for i in {1..6}; do curl http://your-domain/; done,看响应是否来自不同后端 IP。











