上一篇 下一篇 分享链接 返回 返回顶部

Nginx SNI多证书站点配置实战指南

发布人: 发布时间:13小时前 阅读量:5

背景与需求

在单台服务器上通过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.pem

2. 编写独立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),可进一步实现证书到期自动续期,形成高可用、低维护的多站点部署方案。

目录结构
全文
企业微信 企业微信
微信公众号 微信公众号
服务热线: 400-790-1688
电子邮箱: 3310008520@qq.com