Nginx中配置多域名有两种方式:一是单个server块用空格分隔多个域名(如server_name a.com www.a.com),适用于同站多域,HTTP可靠、HTTPS需SAN证书;二是多个独立server块,每块对应不同站点,需显式listen并遵循精确匹配>通配符>正则的优先级。

在 Linux 的 Nginx 中,server_name 匹配多个域名有两种根本不同的方式:一种是让一个 server 块响应多个域名(共用同一套配置),另一种是用多个独立的 server 块分别处理不同域名(真正意义上的多虚拟主机)。选哪种取决于你是否需要为每个域名提供差异化服务(如不同根目录、证书、重定向规则等)。
一个 server 块支持多个域名(同站多域)
适用于 www 与主域跳转、API 域名共用后端等场景。只需在 server_name 后用空格分隔所有域名,不能加逗号、引号或换行:
server_name example.com www.example.com shop.example.com;- 请求 Host 头匹配其中任一,就会进入这个 server 块
- 可通过
$host变量在内部做区分,比如:if ($host = "shop.example.com") { rewrite ^/(.*)$ /shop/$1 break; } - HTTP 下完全可靠;HTTPS 必须使用 SAN 证书,且所有域名都得包含在证书的 Subject Alternative Name 字段中
多个 server 块实现真正多站点(独立虚拟主机)
这是更常见、更规范的做法,每个域名(或域名组)拥有专属配置:
- 每个
server块必须显式声明listen 80或listen 443 ssl - 每个块写自己的
server_name,可单个、多个或通配符,例如:server { listen 80; server_name a.com www.a.com; root /var/www/a; }server { listen 80; server_name b.net www.b.net; root /var/www/b; } - 若只配了一个 server 块,Nginx 会把它当作默认 server,
server_name实际不生效——所以至少两个块才能体现匹配逻辑 - 匹配优先级:精确匹配 >
*.example.com(前导通配) >www.*(尾部通配) > 正则表达式
常见踩坑点和验证方法
配置容易写错,但排查很直接:
- 语法错误:运行
nginx -t检查配置是否合法 - 实际加载了什么:执行
nginx -T | grep "server_name"查看最终生效的值 - HTTPS 不生效:不是
server_name写错了,而是 SNI 阶段只认首个域名对应的证书;确保用certbot -d a.com -d www.a.com等方式申请含全部域名的 SAN 证书 - 匹配失败:检查 Host 请求头是否带末尾点(
example.com.)、大小写、空格或 DNS 解析是否指向正确 IP
小技巧:用正则减少重复配置
当管理大量相似结构的子域(如 user1.example.org、user2.example.org),可用正则捕获简化:
server_name ~^(?<subdomain>.+)\.example\.org$;</subdomain>- 然后用
$subdomain变量动态设置 root 或 proxy_pass,例如:root /var/www/sites/$subdomain; - 注意正则性能略低,不建议用于高并发核心域名


















