Nginx 的 server_name 指令不支持权重映射,仅按精确匹配、通配符、正则顺序进行 Host 头路由;多域名权重分流需通过独立 server 块绑定不同 upstream 并在 upstream 中设置 weight 实现。

Nginx 的 server_name 指令本身不支持权重映射。它只负责匹配请求中的 Host 头,决定由哪个 server 块处理该请求,匹配逻辑是“非此即彼”,没有概率、比例或权重概念。
如果你看到“多域名 + 权重”的需求,实际要解决的通常是以下两类场景之一,需用不同机制实现:
✅ 场景一:同一台 Nginx 服务下,多个域名指向同一后端集群,但希望按域名分流不同权重
这不是 server_name 的事,而是 upstream 负载均衡层的事。你需要:
- 为每个域名单独配置一个
server块 - 每个
server块内proxy_pass到不同的 upstream 名称 - 在
upstream定义中设置weight参数
# 域名 A(高权重)
server {
listen 80;
server_name site-a.com www.site-a.com;
location / {
proxy_pass http://backend_a;
proxy_set_header Host $host;
}
}
# 域名 B(低权重)
server {
listen 80;
server_name site-b.com www.site-b.com;
location / {
proxy_pass http://backend_b;
proxy_set_header Host $host;
}
}
upstream backend_a {
server 10.0.0.10:8080 weight=70;
server 10.0.0.11:8080 weight=30;
}
upstream backend_b {
server 10.0.0.10:8080 weight=20;
server 10.0.0.11:8080 weight=80;
}⚠️ 注意:这里权重作用于后端服务器之间,不是域名之间;但通过分离 upstream,可实现“域名 → 不同权重策略”的间接效果。
✅ 场景二:多个域名共用同一个 server 块,但想让其中某些域名优先匹配或特殊处理
这靠 server_name 的匹配优先级规则实现,不是权重,而是顺序控制:
- 精确匹配(如
example.com)最高优先 -
*.example.com次之(仅左通配) - 正则(
~^...$)最低
你可以利用这点“模拟”倾向性:
server {
listen 80;
# 精确匹配主域名(最优先)
server_name example.com www.example.com api.example.com;
# 再加一条通配,兜底其他子域(次优先)
# server_name *.example.com; ← 若启用,会抢走上面没列全的子域
# 或用正则捕获并设变量,做差异化响应
server_name ~^(?<sub>.+)\.example\.com$;
location / {
# 根据 $sub 变量做判断,例如:
if ($sub = "admin") {
proxy_pass http://admin_backend;
}
if ($sub = "api") {
proxy_pass http://api_backend;
}
}
}❌ 常见误解澄清
-
server_name example.com www.example.com weight=2;→ 语法错误,weight不是server_name的合法参数 -
map指令也不能直接给server_name加权,它只能映射变量(如$host→$backend),再配合proxy_pass使用,属于进阶间接方案,不推荐初学者用于简单分流
不复杂但容易忽略:server_name 是静态路由开关,权重属于后端分发逻辑。搞清这两层职责,配置就清晰了。


















