Nginx支持单IP单443端口多域名多SSL证书,依赖SNI技术;需OpenSSL≥1.0.1、启用--with-http_ssl_module,每个域名配独立server块并指定专属证书路径,用openssl s_client验证证书匹配。
Nginx 支持在同一台服务器、同一个 IP 和 443 端口上,为多个域名分别使用不同的 SSL 证书——前提是启用 TLS SNI(Server Name Indication)并正确配置。
核心逻辑很简单:每个域名对应一个独立的 server 块,各自声明 listen 443 ssl、server_name、ssl_certificate 和 ssl_certificate_key。
只要 Nginx 编译时启用了 --with-http_ssl_module,且底层 OpenSSL 版本 ≥1.0.1(现代系统基本都满足),SNI 就默认可用,无需额外开启开关。
运行以下命令检查:
nginx -V 2>&1 | grep -i "sni"
如果输出含 TLS SNI support enabled,说明支持;若显示 disabled,需升级 OpenSSL 并重新编译 Nginx(较旧系统才需此步,当前主流发行版如 Ubuntu 22.04+/CentOS 8+ 默认支持)。
为每个域名单独写一个 server 块,路径、证书、域名一一对应:
server_name 值唯一且准确(如 example.com 和 api.example.com 是两个不同域名)644(.crt)和 600(.key)server 块都监听 443 ssl,不冲突——SNI 会在 TLS 握手阶段自动路由到对应证书示例:
server {listen 443 ssl;server_name site-a.com www.site-a.com;ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;# 其他配置...}server { listen 443 ssl; server_name site-b.net api.site-b.net; ssl_certificate /etc/letsencrypt/live/site-b.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site-b.net/privkey.pem;
其他配置...}
server 块里(如 ssl_certificate cert1.pem; ssl_certificate cert2.pem;)——Nginx 不识别这种写法,会报错或行为异常*.example.com 只能匹配子域,不能匹配 another.com)ssl_certificate + ssl_certificate_key 配合 ssl_trusted_certificate 实现双栈,但非“多域名”场景重启 Nginx 后,用以下命令逐个验证证书是否被正确返回:
openssl s_client -connect site-a.com:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "Subject:
替换 site-a.com 为你的域名,观察 Subject 中 CN 或 SAN 是否匹配预期证书。
浏览器访问各域名,地址栏锁图标应显示“安全”,点击可查看证书详情,确认签发对象一致。