Nginx SNI多证书站点配置实战指南
背景与需求
在单台服务器上通过Nginx部署多个HTTPS站点时,传统的做法是为每个站点分配独立IP。但随着IPv4地址资源枯竭和云服务器成本控制需求,基于SNI(Server Name Indication)的虚拟主机方案成为主流。SNI允许客户端在TLS握手时携带目标域名,Nginx据此选择对应的SSL证书,从而在同一个IP和端口(默认为443)上承载多个带独立证书的站点。
环境准备
本文假设您已具备以下条件:
- Nginx版本≥1.11.5(该版本开始默认支持TLS SNI)
- 已解析到服务器IP的多个域名
- 每个域名对应的有效SSL证书及私钥文件
- 服务器防火墙放行443端口
可使用nginx -V检查编译参数,确认包含--with-stream_ssl_module或--with-http_ssl_module。
配置步骤
1. 创建证书目录结构
建议按域名分目录存放证书,便于管理和后续续期:
/etc/nginx/certs/example1.com/fullchain.pem
/etc/nginx/certs/example1.com/privkey.pem
/etc/nginx/certs/example2.com/fullchain.pem
/etc/nginx/certs/example2.com/privkey.pem2. 编写独立server块
在/etc/nginx/conf.d/下为每个站点创建单独的配置文件,例如example1.com.conf:
server {
listen 443 ssl;
server_name example1.com www.example1.com;
ssl_certificate /etc/nginx/certs/example1.com/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/example1.com/privkey.pem;
# 其他SSL优化参数(按需启用)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/example1.com;
index index.html index.htm;
}同理为example2.com创建对应配置。Nginx会根据TLS握手时的SNI字段自动匹配server_name,选择正确的证书。
3. 设置默认server
为防止无SNI或未知域名的请求被错误处理,建议配置一个默认server(可返回404或重定向):
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/certs/default.pem;
ssl_certificate_key /etc/nginx/certs/default.key;
return 444;
}4. 检查并重载配置
执行以下命令验证语法并生效:
nginx -t
systemctl reload nginx验证与常见问题
验证SNI生效
使用openssl命令测试不同域名是否返回对应证书:
echo | openssl s_client -connect your.server.ip:443 -servername example1.com 2>/dev/null | openssl x509 -noout -subject
subject=CN = example1.com如果输出结果与实际域名匹配,说明SNI配置成功。
注意事项
- 旧版Windows XP、IE8等客户端不支持SNI,会收到默认证书,建议在默认server中提示升级。
- 同一server块中如配置多个
ssl_certificate指令,Nginx仅使用第一个HTTP级别证书,因此多证书必须依赖多个server块。 - 证书续期后需重载Nginx使新证书生效。
结语
通过SNI技术,一台云服务器即可承载大量HTTPS站点,显著降低IDC租用成本和运维复杂度。配合自动化证书管理工具(如Certbot),可进一步实现证书到期自动续期,形成高可用、低维护的多站点部署方案。