server_name 是 Nginx 实现虚拟主机的核心指令,通过匹配 Host 请求头决定处理 server 块;支持空格分隔多域名、*.example.com 泛域名(不匹配根域)、.example.com 兼容写法,并遵循精确匹配>泛域名>正则的优先级规则,且需配合 DNS 解析与 nginx -t 校验生效。

server_name 是 Nginx 实现虚拟主机(即“一个 IP 托管多个域名”)的核心指令,它通过匹配 HTTP 请求头中的 Host 字段来决定由哪个 server 块处理请求。配置多个域名和泛域名的关键在于写法规范与匹配优先级逻辑。
多个域名在同一 server 块中配置
适用于主站与 www、多语言子域或同业务不同别名等场景。多个域名用空格分隔,不加逗号:
server_name example.com www.example.com shop.example.com;- 所有域名共用同一套配置(root、location、SSL 等)
- Nginx 对这些域名做精确匹配,顺序无关,全部视为同等有效
- 注意:不能混用通配符或正则表达式与纯域名(否则整行失效)
泛域名(通配符)配置
用 * 匹配任意一级子域名,但不能匹配根域名本身(如 *.example.com 不匹配 example.com):
-
server_name *.example.com;→ 匹配api.example.com、blog.example.com,不匹配example.com -
server_name .example.com;(前面带点)等价于*.example.com,是较老的兼容写法 - 泛域名匹配优先级低于精确匹配,高于正则;建议单独设一个 server 块,避免干扰主站
混合配置:精确 + 泛域名 + 正则(需注意优先级)
当需要覆盖多种情况时,可按优先级分块声明(Nginx 自动按规则排序):
- 先写精确匹配:
server_name example.com www.example.com; - 再写泛域名:
server_name *.example.com; - 最后用正则兜底(可选):
server_name ~^(?.+)\.example\.com$; - 务必确保没有两个 server 块监听相同端口+相同 server_name 组合,否则 nginx -t 会报错
DNS 与实际生效前提
仅配置 server_name 不足以让域名访问成功,还需同步完成:
- DNS 解析:为每个域名(含泛域名对应的实际子域)添加 A 或 CNAME 记录,指向服务器公网 IP
- TTL 建议设为 300 秒以内,便于调试时快速刷新
- 若使用泛域名,DNS 需支持通配符解析(主流平台如 Cloudflare、阿里云均支持
*.example.com的 A 记录) - 配置后必须执行
nginx -t检查语法,再nginx -s reload生效











