Nginx可通过SNI为单IP上多个域名配置独立SSL证书,需1.11.0+版本、各server块独立监听443端口并精确匹配server_name与ssl_certificate路径,证书链须完整,配置后用nginx -t验证并reload生效。

在 Nginx 中,可以通过 基于 SNI(Server Name Indication)的虚拟主机配置,为不同域名分别绑定独立 SSL 证书,实现多域名、多证书的 HTTPS 流量分发。Nginx 1.11.0+ 默认支持 SNI,无需额外模块,关键是正确组织 server 块并确保证书路径和域名一一对应。
配置多个独立的 server 块,每个对应一个域名和证书
每个域名需单独定义一个 server 块,监听 443 端口,并设置各自的 ssl_certificate 和 ssl_certificate_key。Nginx 会根据客户端 TLS 握手时发送的 SNI 主机名自动选择匹配的 server 块。
- 确保每个
server_name精确匹配目标域名(支持通配符,如*.example.com) - 证书文件必须为 PEM 格式,私钥不可加密(或启动时手动输入密码,不适用于生产)
- 避免多个 server 块使用相同
server_name或未设server_name,否则可能触发默认匹配逻辑
启用必要的 SSL 协议与安全参数(统一推荐)
虽然证书独立,但 TLS 参数可全局或按块复用。建议在每个 HTTPS server 块中显式配置,保证兼容性与安全性:
-
ssl_protocols TLSv1.2 TLSv1.3;(禁用不安全旧协议) -
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;(优先现代前向保密套件) -
ssl_prefer_server_ciphers off;(让客户端选择最优 cipher) -
ssl_session_cache shared:SSL:10m;和ssl_session_timeout 10m;提升复用效率
验证证书链完整性与 Nginx 配置有效性
常见失败原因不是配置语法错误,而是证书链缺失或路径错误:
- 将中间证书追加到
ssl_certificate的 PEM 文件末尾(顺序:域名证书 → 中间 CA → 不含根 CA) - 用
openssl x509 -in cert.pem -text -noout检查证书 CN/SAN 是否覆盖目标域名 - 运行
nginx -t验证配置,再nginx -s reload生效 - 用
curl -Iv https://domain-a.com和curl -Iv https://domain-b.com分别确认各自返回正确的证书信息
可选:添加 HTTP 自动跳转与泛域名支持
提升可用性与维护性:
- 为每个域名补充 80 端口 server 块,用
return 301 https://$host$request_uri;强制跳转 - 若需支持子域名,可用
server_name ~^(?<sub>.+)\.example\.com$;</sub>配合ssl_certificate动态路径(需配合 map 指令或 Lua,普通场景建议静态配置更稳妥) - 证书更新后,仅需替换对应 PEM 文件并 reload,不影响其他域名服务
不复杂但容易忽略:SNI 依赖客户端支持(所有现代浏览器和 curl 都支持),但极老旧系统(如 Windows XP + IE6)无法识别,如需兼容这类环境,需改用 IP-based SSL(即每个域名独占 IP),现已基本淘汰。


















