为多个虚拟主机配置独立SSL证书需每个域名独占server块并指定专属证书路径,依赖SNI自动匹配;Nginx≥1.11.0和OpenSSL≥1.0.2天然支持;须严格设置权限、验证证书、配置HTTP跳转与默认HTTPS拦截,并通过nginx -t和curl验证。

为多个虚拟主机配置独立 SSL 证书,核心是让每个域名走自己的 server 块,并在块内明确指定专属证书路径——Nginx 依赖 SNI(Server Name Indication)在 TLS 握手阶段识别域名,自动匹配对应证书。只要 Nginx 版本 ≥1.11.0、OpenSSL ≥1.0.2,无需额外开启功能,天然支持。
每个域名一个 server 块,证书路径不共用
不能把多个域名写在一个 server 块里再指望 Nginx “智能选证”。必须为每个主域(含子域)单独定义 server 块,且每个块中:
-
监听统一端口:都写
listen 443 ssl http2; -
精确声明域名:如
server_name example.com www.example.com;,确保与证书的 SAN 字段完全一致 -
指定专属证书路径:
ssl_certificate和ssl_certificate_key必须指向该域名对应的 PEM 文件,例如:ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
证书文件准备与权限要到位
证书不是配对就完事,路径和权限出错会导致 Nginx 启动失败或证书加载异常:
- 私钥文件权限必须为
600(仅属主可读写),执行:chmod 600 /etc/letsencrypt/live/example.com/privkey.pem - 证书文件(含完整链)建议用 PEM 格式,顺序为:站点证书 → 中间 CA →(不含根 CA)
- 可用命令验证证书是否覆盖目标域名:
openssl x509 -in fullchain.pem -text -noout | grep -A1 "Subject Alternative Name"
HTTP 跳转与兜底配置别漏掉
只配 HTTPS 不够,用户常从 HTTP 访问,还需补充基础安全逻辑:
- 为每个域名加一个
listen 80的server块,强制跳转:return 301 https://$host$request_uri; - 加一个默认 HTTPS server 拦截非法 SNI 请求(比如直接用 IP 访问或未知域名):
server { listen 443 ssl default_server; server_name _; return 444; } - 通用 TLS 参数(如协议、加密套件)可统一写在
http块中复用,但ssl_certificate绝对不能上提——否则所有域名都会加载同一份证书
改完必须验证再重载
Nginx 不允许带错误的 SSL 配置生效,一次失败可能中断全部 HTTPS 服务:
- 每次修改后,先运行:
sudo nginx -t
确认输出包含syntax is ok和test is successful - 验证通过后,用:
sudo nginx -s reload
(不用restart,避免连接中断) - 用 curl 测试各域名是否返回正确证书:
curl -Iv https://example.com 2>&1 | grep "subject:"


















