nginx轮询本身不支持按路径前缀独立调度,但可通过为不同路径(如/api/、/static/)配置独立upstream块并结合精准location匹配,实现各路径组内隔离轮询;每个upstream可单独设置权重、健康检查等参数,确保调度精准可控。

Nginx 的轮询(Round Robin)本身是作用于 upstream 组内的服务器调度,它不直接感知 URL 路径——也就是说,**轮询本身不支持“按路径前缀做独立轮询”**。但你可以通过组合 upstream 分组 + location 路由,实现「基于路径前缀的精准轮询」效果:即不同路径前缀的请求,进入各自独立的轮询组,互不影响。
用多个 upstream 实现路径前缀隔离轮询
核心思路是:为每个关键路径前缀(如 /api、/static、/admin)定义专属的 upstream 块,每个块内启用独立轮询;再在 location 中精准匹配路径并转发到对应 upstream。
- 每个
upstream是独立轮询单元,彼此不共享计数或状态 - 路径匹配需使用精确前缀(如
location /api/)或正则(如location ~ ^/api/v[12]/)确保不误触 - 避免使用模糊的
location /覆盖所有路径,否则会绕过路径分流逻辑
配置示例:/api 和 /static 各走自己的轮询组
以下配置让 /api/xxx 请求轮询后端 API 服务集群,/static/xxx 请求轮询静态资源集群,两者完全隔离:
http {
# API 服务轮询组(3台,等权重)
upstream api_backend {
server 192.168.1.101:3000;
server 192.168.1.102:3000;
server 192.168.1.103:3000;
}
<pre class="brush:php;toolbar:false;"># 静态资源轮询组(2台)
upstream static_backend {
server 192.168.1.201:80;
server 192.168.1.202:80;
}
server {
listen 80;
# 精准匹配 /api/ 开头(注意末尾斜杠,避免匹配 /apixxx)
location /api/ {
proxy_pass http://api_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 精准匹配 /static/ 开头
location /static/ {
proxy_pass http://static_backend/;
expires 1h;
add_header Cache-Control "public, immutable";
}
# 其他请求默认走主应用轮询组(可选)
location / {
proxy_pass http://app_backend/;
}
}}
进阶技巧:路径前缀 + 权重/健康检查灵活叠加
每个 upstream 块可独立配置轮询增强参数,比如为某路径组启用故障自动剔除,或按机器性能分配权重:
-
给 /api/ 组加健康保障:
server 192.168.1.101:3000 max_fails=2 fail_timeout=15s; -
给 /static/ 组加权重:若某静态服务器性能更强,可写
server 192.168.1.201:80 weight=3;,它将承担约 3/5 的静态请求 -
路径匹配更严谨:用
location ^~ /api/可禁止正则匹配干扰,提升匹配效率
验证是否生效的关键方法
不能只看单次请求,要观察路径分组内的轮询行为是否独立稳定:
- 对
curl http://your-domain/api/user连续请求 6 次,检查后端 access.log 是否在 101→102→103→101… 循环 - 同时对
curl http://your-domain/static/logo.png请求,确认日志只在 201 和 202 间交替,与 API 组完全无关 - 临时停掉
192.168.1.102,再发 API 请求,应自动跳过该节点,其余两台继续轮询











