Nginx 无原生统一管理 server_name 机制,但可通过 include 指令结合 common-names.conf(map 定义)、模板化 server 块、fallback.conf 默认服务、按类型分组 include 等方式实现集中维护、避免重复与冲突。

Nginx 本身不提供“统一管理 server_name 规则”的原生抽象机制,但可以通过 include 指令配合合理组织配置结构,把分散、重复、易变的 server_name 相关逻辑抽离出来,实现集中定义、按需复用、避免冲突。关键不是让所有 server 共享同一个 server_name,而是让多站点中共用的域名匹配策略、泛域名规则、重定向逻辑或默认 fallback 行为变得可维护。
以下几种实用方式,覆盖常见复杂场景:
把泛域名和常用别名集中到一个共享文件
当多个站点需要支持类似 www.example.com、example.com、*.example.com 这类通用域名组合时,不要每个 server 块里都写一遍。
在 /etc/nginx/conf.d/common-names.conf 中定义变量或 map:
# common-names.conf
map $host $site_root {
default "default";
~^www\.(?<s>.+)\.com$ $s;
~^([a-z0-9\-]+)\.com$ $1;
}</s>
然后在各 server 块中引用:
server {
listen 80;
server_name example.com www.example.com *.example.com;
include /etc/nginx/conf.d/common-names.conf;
# 后续用 $site_root 做路径判断或日志标记
}
注意:map 必须放在 http{} 块顶层,不能在 server 内;server_name 仍需显式写出,但可通过注释+统一维护降低出错率。
用 include 实现“模板化 server 块”
对结构高度一致的站点(如 SaaS 多租户子域),可把 server 块主体拆成模板,只留变量占位:
- 在
/etc/nginx/conf.d/templates/tenant-server.conf中写:server { listen 80; server_name $TENANT_DOMAIN; root /www/tenants/$TENANT_ID; location / { try_files $uri $uri/ =404; } } - 然后在具体站点文件中设置变量并 include:
# /etc/nginx/sites-enabled/tenant-a.conf env TENANT_ID=tenant_a; set $TENANT_DOMAIN "a.example.com www.a.example.com"; include /etc/nginx/conf.d/templates/tenant-server.conf;
⚠️ 注意:
set和env对server_name无效(它不支持变量展开),所以server_name仍需静态写死;但root、location路径等可动态化,适合批量部署。
用 include 控制默认 server 和 fallback 逻辑
当有大量 server_name 匹配失败时,你希望统一跳转、返回特定页面或记录日志,而不是落到第一个 server 块:
- 单独建
/etc/nginx/conf.d/fallback.conf:server { listen 80 default_server; listen 443 ssl default_server; server_name _; return 444; # 或 redirect to maintenance page access_log /var/log/nginx/fallback.log; } - 主配置中确保它被最先加载(例如命名为
00-fallback.conf),再include sites-enabled/*.conf。
这样所有未匹配的请求都会走这里,不用在每个server里重复加if ($host !~ ...)判断。
按域名类型分组 include,提升可读性与协作效率
比如把所有泛域名规则归到 wildcards.conf,所有内部服务域名归到 internal-domains.conf,所有重定向域名归到 redirects.conf:
# nginx.conf 中 http 块内 include /etc/nginx/conf.d/wildcards.conf; # *.api.example.com, *.admin.example.com include /etc/nginx/conf.d/internal-domains.conf; # api.internal, db.proxy include /etc/nginx/conf.d/redirects.conf; # old-site.com → new-site.com include /etc/nginx/sites-enabled/*.conf; # 具体站点
每类文件内容清晰,修改某类规则时不会误动其他逻辑,也方便 Git 提交时看 diff。
每次调整后务必执行:
-
nginx -t确认语法和路径有效 -
nginx -T | grep "server_name"快速检查是否重复定义或顺序异常 - 查看
nginx -T输出中实际生效的server_name列表,验证通配符和正则是否按预期加载
不复杂但容易忽略。











