Nginx通过http块内定义多个全局唯一upstream,结合location路径匹配实现业务分流;各upstream可独立配置负载策略、健康检查及backup,proxy_pass需注意前缀截断与透传,并统一设置代理头和超时参数。

Nginx 通过多个 `upstream` 块配合 `location` 规则,可以实现精细化的业务流量分流——比如把 `/api/` 转给后端 API 集群,把 `/static/` 转给静态资源集群,把 `/admin/` 转给独立管理服务。关键不在“能不能”,而在于**位置对不对、匹配准不准、转发稳不稳**。
upstream 必须定义在 http 块顶层
所有 upstream 块只能出现在 http{} 范围内,不能塞进 server 或 location 里。名称必须全局唯一,例如:
upstream api_backend { server 10.0.1.10:3000; server 10.0.1.11:3000; }upstream static_cluster { server 10.0.2.20:8080; server 10.0.2.21:8080; }upstream admin_service { server 10.0.3.30:9000; }
定义后,它们就变成可被任意 server 块中的 proxy_pass 引用的“服务名”。
location 匹配决定请求去哪组 upstream
同一个 server 块里,不同 location 可以指向不同 upstream,实现路径级分流。注意匹配优先级和末尾斜杠语义:
-
location /api/ { proxy_pass http://api_backend/; }→ 匹配所有以/api/开头的路径,proxy_pass后加/表示截断前缀 -
location ^~/static/ { proxy_pass http://static_cluster/; }→ 使用^~提升前缀匹配优先级,避免被正则 location 覆盖 -
location /admin { proxy_pass http://admin_service; }→ 不加末尾/,则完整路径透传(如请求/admin/users会转发为http://admin_service/admin/users)
每个 upstream 可独立配置负载策略与健康检查
不同业务对稳定性、会话、性能要求不同,upstream 可差异化设置:
-
api_backend用ip_hash保 session:upstream api_backend { ip_hash; server ...; } -
static_cluster用加权轮询:server 10.0.2.20:8080 weight=3; -
admin_service加强探测:server 10.0.3.30:9000 max_fails=2 fail_timeout=15s; - 关键服务可配
backup:server 10.0.3.31:9000 backup;
别漏掉代理头和超时参数
每次 proxy_pass 后,建议统一补全基础代理头和超时控制,尤其多 upstream 共存时容易遗漏:
-
proxy_set_header Host $host;→ 保证后端拿到原始域名 -
proxy_set_header X-Real-IP $remote_addr;→ 传递真实客户端 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;-
proxy_connect_timeout 15;、proxy_read_timeout 60;→ 按业务响应特征调整,API 类可设短些,文件下载类可设长些











