Nginx单IP托管多HTTPS站点核心依赖SNI技术,通过TLS握手初期传递域名信息实现证书精准匹配;需Nginx≥1.11.0、OpenSSL支持SNI,各server块独立配置证书路径,无SNI请求时默认使用首个server块证书,并可用openssl s_client验证。

用Nginx在单个IP上托管多个HTTPS站点,核心靠SNI(Server Name Indication)——它让服务器在TLS握手初期就拿到域名,从而选对证书。只要Nginx版本 ≥1.11.0、OpenSSL支持SNI(主流系统默认满足),就不需要额外端口或IP。
确认环境是否 ready
先验证底层支持是否到位:
- 运行 nginx -V 2>&1 | grep -i openssl,看到类似 OpenSSL 1.1.1w 的输出即表示可用;若显示 BoringSSL 或无结果,需换用官方预编译包或重编译
- Nginx 1.11.0+ 已默认启用 SNI,无需手动开启指令,但必须确保未禁用 ssl 模块
为每个域名配独立证书
证书不能混用,否则 Nginx 启动不报错,实际只加载第一个 server 块的证书作为 fallback:
- 推荐用 certbot 自动申请:比如 certbot --nginx -d site-a.com 和 certbot --nginx -d site-b.net,各自生成隔离的证书目录
- 证书路径要明确指向各自的 fullchain.pem 和 privkey.pem,不要跨 domain 复用同一组 ssl_certificate 指令
- 泛域名证书(如 *.example.com)可覆盖子域,但无法用于完全无关的主域(如 example.com 和 other.net)
Nginx 配置关键写法
每个 HTTPS server 块必须完整独立,且顺序有影响:
- 监听 443 端口,server_name 必须精确匹配所申请证书的域名(支持多 name,如 server_name a.com www.a.com;)
- ssl_certificate 和 ssl_certificate_key 路径要一一对应,不可省略或共用
- 未带 SNI 的请求(如旧设备、curl 不加 -servername)会命中第一个定义的 server 块——建议把最常用或默认站点放在最前,或显式标记 default_server
快速验证是否生效
不用等浏览器,用 OpenSSL 直接测 TLS 层行为:
- openssl s_client -connect your.ip:443 -servername site-a.com -showcerts 2>/dev/null | openssl x509 -noout -subject —— 应返回 site-a.com 的证书主体
- 同理换 -servername site-b.net,应返回另一张证书信息
- 若省略 -servername,返回的应是配置中第一个 server 块的证书


















