nginx通过upstream定义业务集群,结合域名、路径前缀或请求头实现精准路由隔离,并配置健康检查与故障隔离机制保障业务独立性。

在 Nginx 中通过反向代理实现后端集群的业务隔离,核心在于利用 upstream 块定义不同业务组,再结合 location 或请求头、域名等条件将流量精准路由到对应集群,避免服务间相互干扰。
按域名区分业务集群
多个业务共用同一入口 IP 时,最常用方式是基于 server_name 匹配不同域名,为每个域名配置独立的 upstream 和转发逻辑。
例如:用户访问 api.pay.example.com 走支付集群,api.user.example.com 走用户集群:
- 在
http块中分别定义两个 upstream:
server 10.0.1.10:8080;
server 10.0.1.11:8080;
} upstream user_backend {
server 10.0.2.20:8080;
server 10.0.2.21:8080;
}
- 在
server块中按域名绑定 upstream:
listen 443 ssl;
server_name api.pay.example.com;
location / {
proxy_pass http://pay_backend;
proxy_set_header Host $host;
}
} server {
listen 443 ssl;
server_name api.user.example.com;
location / {
proxy_pass http://user_backend;
proxy_set_header Host $host;
}
}
按路径前缀隔离业务
当多个业务共享同一域名(如都走 api.example.com),可通过 location 的路径匹配做分流。
- 确保路径前缀不重叠,例如
/pay/和/user/; - 注意
proxy_pass末尾斜杠的语义:带斜杠会截断匹配路径,不带则原样透传; - 建议显式重写
Host和X-Forwarded-For,便于后端识别真实来源。
示例:
location /pay/ {proxy_pass http://pay_backend/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
} location /user/ {
proxy_pass http://user_backend/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
按请求头或参数动态路由
适合灰度发布、AB 测试或内部多租户场景。Nginx 可通过 map 指令提取变量,再在 proxy_pass 中引用。
- 定义 map 将特定 header(如
X-Business)映射到 upstream 名称; - 在 location 中使用该变量作为 proxy_pass 目标;
- 注意 map 必须定义在 http 块顶层,且变量名不能与内置变量冲突。
示例:
map $http_x_business $backend {default pay_backend;
"user" user_backend;
"admin" admin_backend;
} location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
}
健康检查与故障隔离
业务隔离不仅是路由分离,还需防止一个集群故障影响其他业务。Nginx 开源版支持基础健康检查,商业版(Nginx Plus)功能更全。
- 使用
max_fails和fail_timeout控制节点摘除; - 搭配
slow_start避免新节点上线时流量突增; - 可启用
backup标记备用节点,仅当主集群全部不可用时启用; - 建议配合日志记录 upstream response time 和 status,便于定位跨集群干扰问题。











