server_name 本身不直接结合 upstream 实现动态分发,仅匹配 host 头选择 server 块;真正的动态分发由 upstream 与 proxy_pass 组合完成,常用方式是按域名配置多个 server 块各引用专属 upstream。

server_name 本身不直接“结合” upstream 实现动态分发,它只负责匹配请求的 Host 头,决定走哪个 server 块;真正做动态分发的是 upstream + proxy_pass 的组合。但你可以用 server_name 配合多个 upstream,实现按域名路由到不同后端集群——这是最常用、最清晰的“动态分发”方式。
按域名选择 upstream(最常用)
每个 server 块用不同的 server_name,内部引用专属 upstream,天然实现基于 Host 的分发:
- 用户访问
api.example.com→ 匹配第一个server→ 转发到upstream api_backend - 用户访问
admin.example.com→ 匹配第二个server→ 转发到upstream admin_backend
配置示例:
upstream api_backend {
server 10.0.1.10:8000 weight=3;
server 10.0.1.11:8000;
}
upstream admin_backend {
server 10.0.2.5:9000;
server 10.0.2.6:9000;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_backend;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://admin_backend;
proxy_set_header Host $host;
}
}
用变量 + map 模块实现更灵活的域名映射
当域名数量多、或需运行时计算(如通配符、正则提取子域),可用 map 把 $host 映射为 upstream 名称变量,再在 proxy_pass 中引用:
-
map必须写在http块顶层,不能在server内 - Nginx 不支持在
proxy_pass中直接写变量名(如http://$upstream_name),但支持http://$upstream_name/这种带斜杠的写法(要求该变量值是合法 upstream 名)
示例(按子域自动路由):
http {
map $host $backend {
~^([a-z0-9]+)\.example\.com$ $1_backend;
default default_backend;
}
upstream user_backend { server 10.0.3.1:3000; }
upstream order_backend { server 10.0.3.2:4000; }
upstream default_backend { server 10.0.3.3:8080; }
server {
listen 80;
server_name ~^[a-z0-9\-]+\.(example\.com)$;
location / {
proxy_pass http://$backend/;
proxy_set_header Host $host;
}
}
}
这样 user.example.com → $backend = "user_backend" → 走对应 upstream。
注意:proxy_pass 的斜杠决定路径转发行为
是否加末尾斜杠,直接影响 URL 路径重写,和分发逻辑无关但极易出错:
-
proxy_pass http://backend;(无斜杠)→ 请求/api/v1/user会原样转发到后端/api/v1/user -
proxy_pass http://backend/;(有斜杠)→ 请求/api/v1/user会被重写为/v1/user(去掉 location 匹配前缀)
尤其配合多 server_name 分发时,若各后端 API 路径结构不一致,这个细节会导致 404。
不推荐:在 proxy_pass 中硬编码 IP 或域名
虽然语法允许 proxy_pass http://192.168.1.100:8080;,但这绕过了 upstream,失去负载均衡、健康检查、故障转移能力。哪怕只有一台后端,也建议定义一个单节点 upstream,便于后续扩展。











