唯一可靠方式是为每个server块单独配置ssl_certificate和ssl_certificate_key,确保一一对应、san匹配、私钥权限600、绝对路径,并显式声明listen 443 ssl。

直接为每个 server 块单独写明 ssl_certificate 和 ssl_certificate_key,是 Nginx 实现多域名/子域名独立 HTTPS 的唯一可靠方式。
每个 server 块必须独占一套证书路径
Nginx 不支持在一个 server 块里通过变量、if 判断或条件逻辑切换证书。它只在启动或重载时读取一次该块内的证书路径,且不支持运行时加载。
- 写法正确:一个
server块只声明一个(或一组)server_name,并配一套ssl_certificate+ssl_certificate_key - 写法错误:把多个域名合并在一个块里,如
server_name a.com b.com;却只配一份证书——浏览器访问 b.com 会报“证书名称不匹配” - 写法危险:把证书指令提到
http块中试图复用——会导致所有 HTTPS 站点都用同一份证书,失去隔离性
证书内容必须覆盖 server_name 中的所有主机名
证书的 Subject Alternative Name(SAN)字段需包含该 server 块中列出的全部域名,否则 TLS 握手会失败。
- 若
server_name example.com www.example.com;,证书必须同时含这两个 SAN 条目 - 子域名如
api.example.com和blog.example.com必须各自使用专属证书,或共用一张含全部子域的多域名证书 - 验证方法:
openssl x509 -in /path/to/cert.pem -text -noout | grep -A1 "Subject Alternative Name"
文件权限与路径必须严格规范
私钥泄露风险高,Nginx 默认拒绝加载权限过宽的私钥文件;相对路径易因工作目录变化导致加载失败。
- 私钥文件权限必须设为
600:chmod 600 /etc/letsencrypt/live/example.com/privkey.pem - 证书和私钥路径建议使用绝对路径,避免 Nginx 启动时解析出错
- 确保 Nginx 主进程用户(通常是
www-data或nginx)有读取权限
监听与 SSL 指令要成对出现
每个启用 HTTPS 的 server 块,必须显式声明 listen 443 ssl(或 listen 443 ssl http2),否则不会进入 SSL 上下文。
-
ssl_protocols、ssl_ciphers等安全参数可统一放在http块中继承,但证书路径绝不继承 - 若某站点需特殊策略(如仅允许 TLSv1.3),可在其
server块中覆盖全局设置 - 修改后务必执行
nginx -t验证语法,再nginx -s reload生效











