Nginx 可通过单个 server 块配置多个域名共享 SSL 证书与根目录,需使用 SAN 或泛域名证书,配合统一的 ssl_certificate、server_name 和 root 指令实现;同时应配置 80 端口全量 301 跳转至 HTTPS,并确保静态资源适配多域名路由及目录权限正确。

Nginx 为多个虚拟主机(Virtual Host)配置统一的 SSL 证书与根目录,本质是让多个域名共享同一套 HTTPS 配置和静态文件路径。这种做法适用于品牌一致、内容同源的多子域场景(如 www.example.com、shop.example.com、blog.example.com 全部指向同一套前端代码),既简化运维,又确保加密策略统一。
统一 SSL 证书的前提条件
必须使用支持多域名的证书,常见有两类:
-
SAN 证书(Subject Alternative Name):在一张证书中明确列出所有要覆盖的域名,例如
example.com、www.example.com、shop.example.com; -
泛域名证书(Wildcard Certificate):如
*.example.com,可匹配所有一级子域(但不包括example.com本身,需额外添加)。
✅ 注意:单域名证书(仅
example.com)无法用于其他域名,Nginx 会因 SNI 匹配失败导致浏览器报ERR_SSL_UNRECOGNIZED_NAME_ALERT或证书错误。
单 server 块复用多个域名 + 统一证书
无需为每个域名写独立 server 块,只需在一个 server 中用空格列出全部 server_name,并指定共用的证书路径和根目录:
server {
listen 443 ssl http2;
server_name example.com www.example.com shop.example.com blog.example.com;
root /var/www/example-frontend;
index index.html;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
}? 关键点:
ssl_certificate和ssl_certificate_key只需声明一次,Nginx 在 TLS 握手时通过 SNI 自动将该证书返回给任意匹配的server_name—— 这是标准行为,无需额外模块或补丁。
强制 HTTP → HTTPS 并统一路由
为避免 HTTP 明文访问,建议补充一个通用的 80 端口 server,将所有域名统一跳转至 HTTPS:
server {
listen 80;
server_name example.com www.example.com shop.example.com blog.example.com;
return 301 https://$host$request_uri;
}这样无论用户访问哪个域名的 HTTP 版本,都会被重定向到对应 HTTPS 地址,且全部走同一套证书与文件服务。
根目录权限与静态资源一致性
- 所有域名共享
/var/www/example-frontend,意味着该目录下的 HTML、JS、CSS 必须能适配各域名的路由逻辑(例如前端路由需支持base href或 history 模式 fallback); - 确保 Nginx 用户(如
www-data或nginx)对该目录有读取权限:chown -R www-data:www-data /var/www/example-frontend chmod -R 755 /var/www/example-frontend
不推荐混用的情况
- 域名归属不同业务线或客户,存在合规隔离要求(如 PCI DSS);
- 各站点需独立部署、灰度发布或 A/B 测试;
- 某些域名需国密 SM2 证书,而其他用 RSA —— 此时必须分
server块,无法统一。
不复杂但容易忽略


















