可以配置多个 server 块共用同一 upstream,通过 server_name 区分域名、proxy_pass 指向同一 upstream 实现“多入口、一出口”;upstream 必须定义在 http 块内,命名合法且语义化;需透传 host 等头信息,各 server 块可独立定制代理策略。

可以配置多个 server 块共用同一个 upstream,只要它们的 server_name 不同、但 proxy_pass 指向同一 upstream 名称即可。关键不是“共享 upstream”,而是 Nginx 通过 server_name 匹配请求域名,再由各自 location 中的 proxy_pass 统一转发到后端集群——本质上是“多入口、一出口”。
明确 upstream 定义位置与命名规范
upstream 必须定义在 http 块内(不能嵌套在 server 里),且名称要合法(只含字母、数字、下划线、短横线)。名称不参与 DNS 解析,纯属内部引用标识:
- 避免使用带点号的域名如
www.example.com作 upstream 名——虽然语法允许,但易与真实域名混淆,尤其在 AJAX 请求中可能引发 Host 头误传问题 - 推荐用语义化简名,例如
api_backend或web_cluster_v1 - 一个 upstream 可被任意数量的 server 块复用,无需额外声明
为不同域名配置独立的 server 块
每个域名对应一个 server,监听相同端口(如 80/443),靠 server_name 区分路由。所有 server 块都可指向同一个 upstream:
-
server_name支持精确匹配(example.com)、通配符(*.example.com)或正则(~^shop\..*),按优先级顺序匹配 - 多个域名可写在同一行,用空格分隔:
server_name a.com www.a.com b.net www.b.net; - 即使域名不同,只要
proxy_pass http://your_upstream_name;相同,流量就都进入同一组后端服务器
确保后端服务能正确识别原始域名
共享 upstream 时,后端应用收不到原始 Host 头(默认被 proxy_pass 覆盖),需显式透传:
- 必须设置
proxy_set_header Host $host;,否则后端看到的是 upstream 名或 IP,可能导致静态资源路径错误、重定向跳转异常 - 补充常用头:
X-Real-IP、X-Forwarded-For、X-Forwarded-Proto(尤其启用 HTTPS 时) - 若后端依赖 Host 判断租户或站点,这一步不可省略
可选:按域名做差异化代理策略
虽共用 upstream,但每个 server 块可独立定制行为:
- 路径重写:
location /admin/ { rewrite ^/admin/(.*)$ /$1 break; proxy_pass http://shared_upstream; } - 缓存规则:
proxy_cache、proxy_cache_valid可按域名分别配置 - 限流或鉴权:
limit_req、auth_request可针对特定域名启用 - SSL 配置:不同域名可加载各自证书,但 backend 仍走同一 upstream











