nginx 可通过一个 server 块配置多个域名共用同一 ssl 证书,前提是使用 san 或泛域名证书并正确配置 server_name、证书路径及 80 端口重定向;sni 机制自动匹配证书,需用 openssl 验证后 reload。

只要证书本身支持多个域名(比如 SAN 证书或泛域名证书),Nginx 就能用一个 server 块让多个域名共用同一套 SSL 证书和根目录,无需为每个域名单独写配置。
证书必须覆盖所有目标域名
单域名证书(如仅 example.com)不能用于其他域名,否则浏览器会报 ERR_SSL_UNRECOGNIZED_NAME_ALERT。必须使用:
-
SAN 证书:申请时明确列出全部域名,例如
example.com、www.example.com、shop.example.com; -
泛域名证书:如
*.example.com,可匹配所有一级子域(api.example.com、blog.example.com),但不包含根域,需额外把example.com加进 SAN 列表。
一个 server 块配置多个域名
在同一个 server 块中,用空格分隔所有域名,并统一指定证书路径和网站根目录:
server {
listen 443 ssl http2;
server_name example.com www.example.com shop.example.com;
root /var/www/frontend;
index index.html;
<pre class="brush:php;toolbar:false;">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;
}}
Nginx 在 TLS 握手阶段通过 SNI 自动将该证书返回给任一匹配的 server_name,无需额外设置。
HTTP 请求全部强制跳转 HTTPS
补充一个通用的 80 端口 server,把所有域名的 HTTP 请求统一重定向到 HTTPS:
server {
listen 80;
server_name example.com www.example.com shop.example.com;
return 301 https://$host$request_uri;
}
这样既避免明文传输,又确保用户无论输哪个域名都能安全访问。
验证是否生效
用 OpenSSL 直接测试 SNI 是否正确返回对应证书:
-
openssl s_client -connect your.ip:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -subject→ 应显示CN=example.com; - 换域名再试,比如
-servername shop.example.com,结果应一致指向同一张证书主体。
确认无误后执行 nginx -t && nginx -s reload 生效。











