linux上nginx实现多域名共用一个ssl证书,需确保证书为多域名(san)或通配符类型,并在各server块中复用同一证书路径,配置正确server_name、listen 443 ssl及sni支持,同时做好续期自动重载。

Linux 上用 Nginx 实现多域名共用一个 SSL 证书,核心是让多个 server 块都指向同一个证书文件,并确保这些域名都包含在该证书的 Subject Alternative Names(SAN)中。证书本身必须支持多域名,Nginx 配置本身并不“合并”证书,而是复用已签发的合法证书。
确认证书支持多域名(关键前提)
单域名证书(如只含 example.com)无法用于 blog.example.com 或 shop.example.com。必须使用通配符证书(*.example.com)或更常见的多域名(SAN)证书——即一个证书里明确列出所有要使用的域名。
- 申请 Let’s Encrypt 时,用
certbot指定多个-d参数:certbot certonly --nginx -d example.com -d www.example.com -d api.example.com - 检查已有证书是否含多个域名:
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout | grep -A1 "Subject Alternative Name" - 输出中应看到类似
DNS:example.com, DNS:www.example.com, DNS:app.example.com
Nginx 中为每个域名独立配置 server 块
每个域名对应一个 server 块,但全部复用同一组证书路径和私钥。Nginx 会根据 SNI(Server Name Indication)自动匹配请求域名,并由浏览器验证证书中是否包含该域名。
- 证书路径统一写成绝对路径,例如:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; - 每个
server块必须设置server_name,且值需与证书中的域名之一完全一致(区分大小写,不带端口) - 务必启用
ssl和listen 443 ssl http2,并配置基础安全头(如ssl_protocols TLSv1.2 TLSv1.3)
避免常见配置错误
看似能 reload 成功,但实际 HTTPS 请求可能失败或提示证书不匹配,往往源于以下疏漏:
-
server_name 不匹配:比如证书含
www.example.com,但配置里写了example.com却没加 www;建议在证书中同时包含主域和 www 域 -
未监听 443 端口或缺少 ssl 参数:仅写
listen 443不够,必须是listen 443 ssl - 防火墙或云服务商安全组未放行 443:即使 Nginx 配置正确,外部仍无法建立 HTTPS 连接
-
证书路径权限问题:Nginx 工作进程(通常是
www-data或nginx用户)需有读取privkey.pem的权限,但不能是全局可读(600 最佳)
自动化续期与证书更新同步
Let’s Encrypt 证书 90 天过期,续期后证书内容更新,但 Nginx 不会自动重载配置——必须触发 reload。
- 推荐在 certbot 的
--deploy-hook中执行:certbot renew --deploy-hook "systemctl reload nginx" - 也可写成脚本放在
/etc/letsencrypt/renewal-hooks/deploy/目录下,文件名任意(如reload-nginx.sh),加上可执行权限 - 验证续期是否生效:
sudo certbot renew --dry-run,观察日志中是否出现Running deploy hook command











