Nginx 中 Virtual Host 虚拟主机如何配置实现多域名独立访问

作者:袖梨 2026-08-29

Nginx多域名独立访问需为每个域名配置独立server块,通过server_name匹配Host头区分请求;域名须解析至服务器IP,HTTPS需SAN证书并单独配置ssl证书路径,推荐按域名拆分conf.d配置文件并include管理。

在 Nginx 中实现多域名独立访问,本质就是为每个域名配置一个独立的 server 块,靠 server_name 匹配 Host 头来区分请求。关键不在“怎么写”,而在“怎么分”和“怎么配对”——域名要分开管,路径要分开指,证书要分开配(HTTPS 场景下)。

每个域名一个 server 块,不混写

不要把多个不相关的域名塞进同一个 server 块里,比如:

  1. ❌ 错误做法:server_name site-a.com site-b.com;(仅适用于 www 与非 www 跳转或同站多别名)
  2. ✅ 正确做法:为 site-a.com 单独建一个 server 块,再为 site-b.com 建另一个

这样每个站点才能拥有自己独立的 rootaccess_log、SSL 配置、重写规则等。混写会导致行为冲突,比如日志全记到一个文件、证书错配、跳转逻辑互相干扰。

域名必须能解析到服务器 IP

Nginx 只处理已送达的请求。如果 DNS 没生效,或者本地 /etc/hosts 没配,浏览器根本发不出带正确 Host 头的请求。

  1. 检查方式:用 curl -H "Host: site-a.com" http://your-server-ip 测试 —— 若能返回预期页面,说明 Nginx 配置已就绪,问题出在 DNS 或客户端解析
  2. 泛域名 *.example.com 不自动包含 example.com,需额外加一行 server_name example.com *.example.com; 或单独配一个块

HTTP 和 HTTPS 的配置逻辑不同

HTTP 下,server_name site-a.com www.site-a.com; 完全可行,Nginx 会按 Host 头精准匹配;但 HTTPS 涉及 TLS 握手阶段的 SNI 协商,只认 server_name 列表里的第一个域名去加载证书。

  1. HTTPS 必须用 SAN 证书,且所有域名都得出现在 certbot -d site-a.com -d www.site-a.com 这类命令中
  2. 每个 HTTPS server 块应明确写 listen 443 ssl;,并指向自己的证书文件,避免复用同一份 PEM 导致证书不匹配
  3. 建议 HTTP 块统一做 301 跳转到 HTTPS,例如:return 301 https://$host$request_uri;

配置组织推荐分离管理

避免直接修改 /etc/nginx/nginx.conf 主文件,而是按站点拆分:

  1. 新建配置文件如 /etc/nginx/conf.d/site-a.com.conf/etc/nginx/conf.d/site-b.com.conf
  2. 确保主配置中已启用 include /etc/nginx/conf.d/*.conf;(多数发行版默认开启)
  3. 每次改完执行 sudo nginx -t 验证语法,再 sudo systemctl reload nginx 生效

这种结构清晰、易定位、方便备份和迁移,也避免单个错误拖垮全部站点。

相关文章

精彩推荐