Nginx通过SNI机制实现多域名HTTPS共存,必须为每个域名配置独立server块,分别指定精确的server_name和专属ssl_certificate路径,证书与私钥需一一对应、权限合规(私钥600),并经nginx -t验证后reload生效。

不能在同一个 server 块里为不同域名混用证书,但可以为每个域名单独建一个 server 块,并各自指定专属证书路径——这是 Nginx 支持的标准做法。
每个域名对应一个独立的 server 块
Nginx 通过 SNI(Server Name Indication)识别客户端请求的域名,再匹配对应的 server_name 和证书。所以必须为每个域名写一个完整的 server { ... } 配置,不能靠 if 或变量动态切换证书。
- example.com → 单独一个
server块,server_name example.com;,配ssl_certificate /path/to/example.com.pem; - api.example.com → 另一个
server块,server_name api.example.com;,配ssl_certificate /path/to/api.example.com.pem; - 不要在一个块里写多个
server_name并指望它自动选不同证书——Nginx 不支持这种行为
证书路径要准确且权限合规
证书和私钥路径必须是绝对路径,文件需真实存在、可读,且私钥必须严格保护。
- 证书文件(如
fullchain.pem)应包含服务器证书 + 中间证书,不能只放根证书 - 私钥文件(如
privkey.pem)权限必须设为600:sudo chmod 600 /etc/nginx/ssl/*.key - 确保 Nginx 主进程(通常是 root)能读取这些文件,建议属主设为
root:root
DNS 和监听配置不能出错
域名要能正确解析到这台服务器,且每个 server 块都得明确监听 443 ssl。
- 先用
dig example.com +short确认 DNS 已生效,IP 指向你的 Nginx 服务器 - 每个
server块都要有listen 443 ssl;,不能只写listen 443; -
server_name只写当前域名,不加通配符或其它域名(避免意外匹配)
验证与生效要走完整流程
改完配置别直接 reload,先检查再观察日志。
- 运行
sudo nginx -t:确认语法正确,且所有证书路径存在、可访问 - 查看错误日志:
sudo tail -f /var/log/nginx/error.log,留意SSL_CTX_use_certificate_chain_file() failed这类报错 - 重载配置:
sudo systemctl reload nginx(平滑重启,不中断连接) - 浏览器访问后点击地址栏锁图标,确认显示的是该域名对应的证书信息


















