Nginx配置多个域名HTTPS
当你需要在同一台服务器、同一个 IP 下为多个域名配置 HTTPS 时,Nginx 的 SNI(Server Name Indication)机制可以在 TLS 握手阶段根据客户端访问的域名自动选择对应证书。
配置思路并不复杂:每个域名使用一个独立的 server 块,各自绑定自己的证书文件。
本文会给出一个可直接套用的多证书 SNI 配置模板,并说明准备条件、常见坑位和验证方法。
配置前需要准备哪些材料
动手之前,请先确认以下内容都已完成:
- 域名与解析:至少两个域名,并且已经解析到当前服务器 IP。
- SSL 证书:每个域名对应一张证书和私钥。可以是单域名证书,也可以是通配符证书。
- Nginx 环境:Nginx 必须支持 SSL 模块。使用宝塔面板或官方源安装的 Nginx 通常都已开启,不需要额外编译。
- 端口放行:服务器安全组和本机防火墙要放行 443 端口,否则外部无法访问。
如果这些条件不满足,后面的配置即使正确也无法正常生效。
一份可以直接套用的多证书配置模板
在 /etc/nginx/conf.d/ 目录下,可以为每个域名单独创建一个配置文件,例如 aaa.conf 和 bbb.conf,也可以全部写在一个文件里。
推荐分开管理,后期维护更清晰。
以第一个域名为例,配置内容如下:
# /etc/nginx/conf.d/aaa.conf
server {
listen 443 ssl;
server_name aaa.com www.aaa.com;
ssl_certificate /etc/nginx/certs/aaa.com.pem;
ssl_certificate_key /etc/nginx/certs/aaa.com.key;
root /var/www/aaa;
index index.html;
}
第二个域名的配置文件基本一样,只需要替换 server_name、证书路径和网站目录:
# /etc/nginx/conf.d/bbb.conf
server {
listen 443 ssl;
server_name bbb.com www.bbb.com;
ssl_certificate /etc/nginx/certs/bbb.com.pem;
ssl_certificate_key /etc/nginx/certs/bbb.com.key;
root /var/www/bbb;
index index.html;
}
这里的关键点在于:每个 server 块里的 server_name 必须和证书域名对应一致,Nginx 正是根据这个字段在 SNI 握手时选择正确的证书。
如何让 HTTP 自动跳转到 HTTPS
多数站点都希望用户直接输入域名时,能自动从 HTTP 跳到 HTTPS。
实现方式也很简单,为每个域名再加一个 80 端口跳转配置:
server {
listen 80;
server_name aaa.com www.aaa.com;
return 301 https://$host$request_uri;
}
如果有多个域名,就需要写多个这样的 80 端口 server 块,每个对应一个域名。
这里不建议使用 if ($scheme = http) { return 301; } 写在同一个 server 里,单独配置跳转规则更直观,也更容易排查问题。
常见报错与避坑说明
实际配置过程中,下面几个问题最容易遇到:
1. 证书与域名不匹配
如果浏览器提示“证书不安全”,第一反应应该是检查 server_name 和证书中的域名是否完全一致。
很多证书只绑定某个域名,例如证书只包含 aaa.com,那 www.aaa.com 就无法正常使用,需要重新签发包含 www 的证书,或者使用通配符证书。
2. 证书链不完整
部分证书厂商会要求把中间证书和域名证书放在同一个 .pem 文件里。
如果只填了域名证书,浏览器或 curl 会提示证书链不完整。
解决办法是把中间证书内容追加到 .pem 文件末尾,或者通过 ssl_trusted_certificate 单独指定中间证书路径。
3. 默认 server 干扰
当用户直接用 IP 访问服务器时,Nginx 会匹配到默认 server。
如果默认 server 配置了证书,可能会返回错误证书。
稳妥做法是单独设置一个默认 server 块,指向一张能覆盖访问场景的证书,或者直接返回 444 不响应。
4. 配置了没生效
修改配置文件后必须重启或重载 Nginx 才会生效。
先执行 nginx -t 检查语法,再执行 nginx -s reload。
如果语法有误,Nginx 会拒绝重载,并提示具体错误行。
如何验证配置是否成功
完成配置后,按以下顺序验证:
- 检查语法:
nginx -t
看到 syntax is ok 和 test is successful 即说明语法无误。
- 重载配置:
nginx -s reload
- 浏览器访问:分别打开
https://aaa.com和https://bbb.com,点击地址栏锁形图标,查看证书详情是否对应该域名。 - 命令行验证证书:
openssl s_client -connect 127.0.0.1:443 -servername aaa.com \
-brief 2>/dev/null | grep subject
如果返回的 subject 中包含 aaa.com,说明 SNI 证书选择正确。
- 检查跳转:访问
http://aaa.com,确认能 301 跳转到https://aaa.com。
如果你正在配置多个域名 HTTPS,建议先把上面的模板复制一份,按域名逐项替换后完成验证。
遇到证书链或跳转问题时,优先检查证书路径和 server_name 的对应关系。
Nginx 的 SNI 配置非常成熟,只要对应关系不错,基本能一次成功。