一个server块可配置多个域名共用同一SSL证书,前提是证书的SAN包含所有域名,且需配置TLS安全参数和HTTP跳转。

直接在一个 server 块里写全所有域名,证书路径只指定一次,关键是证书本身必须覆盖全部域名。
确保证书支持所有域名
SAN(Subject Alternative Name)证书必须显式包含每个要使用的域名。比如你要用 example.com、www.example.com、api.example.org,那申请证书时就得把这三个都加进 SAN 列表。通配符证书(如 *.example.com)只能匹配一级子域,不自动包含根域,所以 example.com 和 *.example.com 要同时出现在证书里。
验证方法:
openssl x509 -in /path/to/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
输出中应看到类似:DNS:example.com, DNS:www.example.com, DNS:api.example.org
单 server 块内列出全部域名
不用为每个域名单独建 server 块。一个 HTTPS 配置即可:
server {
listen 443 ssl http2;
server_name example.com www.example.com api.example.org;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 其他通用配置(root、location 等)
root /var/www/html;
index index.html;
}注意:
-
server_name后用空格分隔域名,不能加逗号 - 所有域名共用同一组
ssl_certificate和ssl_certificate_key - 不要混用不同证书路径,也不要拆成多个
server块再指向同一证书——这没意义,还可能触发默认块行为
补全必要安全配置
光有证书不够,还得配好 TLS 层基础项:
- 强制使用现代协议:
ssl_protocols TLSv1.2 TLSv1.3; - 限定强加密套件:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...; - 开启会话复用:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; - 加 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
HTTP 自动跳转 HTTPS
另起一个 listen 80 的 server 块做 301 跳转:
server {
listen 80;
server_name example.com www.example.com api.example.org;
return 301 https://$host$request_uri;
}配置完务必执行:
nginx -t && nginx -s reload
避免语法错误或证书路径失效导致服务中断。


















