nginx通过sni技术实现单ip多域名https,需为每个域名配置独立server块、专属证书路径及精确server_name匹配,禁用证书共用,并验证openssl≥1.0.2且sni生效。

一台 Nginx 服务器可以同时为多个域名提供 HTTPS 服务,关键在于每个域名使用独立的 SSL 证书,并通过 SNI(Server Name Indication)技术在 TLS 握手阶段精准匹配。这不是“共用一张证书”,而是每个域名拥有专属的 ssl_certificate 和 ssl_certificate_key 路径,且配置互不干扰。
每个域名配一个 server 块
不能把多个域名写在一个 server 块里再指望它自动切换证书——Nginx 不支持单个块内多证书。必须为每个域名单独定义一个 server 块,都监听 443 ssl:
- 每个块中
server_name必须精确对应该域名(如site-a.com、www.site-a.com,前提是证书也包含这些名称) -
ssl_certificate指向该域名专属的fullchain.pem(含域名证书 + 中间 CA) -
ssl_certificate_key指向对应的privkey.pem(权限设为600) - 避免多个块共用同一证书路径,否则只有第一个块生效,其余全部 fallback 到它
证书路径与命名要严格隔离
推荐按域名分目录管理,结构清晰、更新不串:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 例如:
/etc/nginx/certs/site-a.com/fullchain.pem和/etc/nginx/certs/site-a.com/privkey.pem - 用 Certbot 分别申请:运行
certbot --nginx -d site-a.com和certbot --nginx -d site-b.net,不要合并执行-d site-a.com -d site-b.net(那会生成多域名证书,失去“独立”意义) - 证书文件必须是 PEM 格式;私钥不能加密(否则 reload 时需手动输密码,不适用于生产)
- 永远不要把证书放在 Web 可访问路径下(如
/var/www子目录)
验证环境与配置是否就绪
很多问题其实出在底层支持或配置细节上:
- 运行
nginx -V 2>&1 | grep -o 'OpenSSL [^ ]*',确认输出类似OpenSSL 1.1.1w;若显示BoringSSL或版本低于1.0.2,SNI 不可用 - 执行
nginx -t检查语法,无误后再nginx -s reload - 用
openssl s_client -connect your.ip:443 -servername site-a.com测试,看返回的证书主体是否为site-a.com - 用
curl -Iv https://site-a.com和curl -Iv https://site-b.net分别确认各自证书信息正确
补充 HTTP 跳转和基础安全参数
提升可用性与安全性:
- 为每个域名加一个
listen 80的server块,用return 301 https://$host$request_uri;强制跳转 - SSL 协议统一设为
TLSv1.2 TLSv1.3,禁用旧协议 - 加密套件推荐现代前向保密组合,如
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 -
ssl_session_cache shared:SSL:10m和ssl_session_timeout 10m提高 TLS 复用效率










