Nginx配置多个SSL证书的完整指南
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
当然可以,以下是我根据您提供的原始内容进行错别字修正、语句润色、逻辑补充与语言原创化处理后的优化版本,整体结构更清晰,语言更流畅专业,并增强了技术深度和可读性。
在现代 Web 应用开发中,数据安全已成为系统设计的核心要素之一,HTTPS 协议通过 SSL/TLS 加密机制,有效防止了用户信息在传输过程中的窃听与篡改,作为全球最受欢迎的高性能 Web 服务器之一,Nginx 不仅具备出色的并发处理能力,还广泛用于承载高流量网站和微服务架构的前端代理。
随着业务规模的扩展,单台 Nginx 服务器常常需要为多个独立域名提供服务——例如主站 example.com 和博客站点 blog.example.org,甚至跨品牌的 companyA.com 与 companyB.net,为了保障每个站点的安全通信,必须为其配置独立的 SSL 证书,本文将深入讲解如何在同一个 Nginx 实例中为多个域名部署各自的 SSL 证书,确保各站点均能以安全、稳定的方式运行于 HTTPS 环境下。
为何需要配置多个 SSL 证书?
当一台服务器托管多个网站(即虚拟主机)时,每个站点通常拥有不同的域名,若希望启用 HTTPS,就必须为每一个域名申请并部署相应的 SSL 证书。
虽然通配符证书(如 *.example.com)可以覆盖同一主域下的所有子域名,但它无法适用于完全独立的顶级域名。shop.com 和 blog.net 属于不同品牌或组织,必须使用各自的证书文件。
不同域名可能由不同的证书颁发机构(CA)签发,加密算法(如 RSA 或 ECC)、密钥长度、有效期等也可能存在差异,Nginx 必须具备灵活管理多个证书的能力,才能满足复杂场景下的安全需求。
配置前的准备工作
在开始配置之前,请确认已完成以下基础设置:
-
已安装 Nginx
使用命令nginx -v检查当前版本,推荐使用较新的稳定版(如 1.20+),以获得更好的 TLS 支持和安全性。 -
获取有效的 SSL 证书
每个域名需配备对应的.crt(公钥证书)和.key(私钥文件),建议从可信 CA 获取证书,- 免费方案:Let's Encrypt(配合 Certbot 自动化工具)
- 商业方案:DigiCert、Sectigo、GlobalSign 等
-
完成 DNS 解析
所有域名应正确解析到该服务器的公网 IP 地址,确保客户端可通过域名访问服务。 -
开放 HTTPS 端口
确保防火墙允许 TCP 443 端口通信(必要时也开启 80 端口用于重定向和证书验证)。
配置多个 SSL 证书的具体步骤
Nginx 通过“server 块”实现基于名称的虚拟主机(Name-based Virtual Hosting),结合 SNI(Server Name Indication)技术,可在同一 IP 地址上支持多个 HTTPS 站点。
第一步:整理证书文件结构
建议为每个域名建立独立目录存放其证书,提升管理和维护效率,示例如下:
/etc/nginx/ssl/example.com/
├── example.com.crt
└── example.com.key
/etc/nginx/ssl/blog.example.org/
├── blog.example.org.crt
└── blog.example.org.key
⚠️ 权限提示:私钥文件应设置严格权限,避免泄露。
chmod 600 /etc/nginx/ssl/*/ *.key chown root:root /etc/nginx/ssl -R
第二步:编写 Server 块配置
将配置文件放置于 /etc/nginx/sites-available/ 目录,并通过符号链接启用,您可以为每个站点单独建文件,也可在一个文件中定义多个 server 块。
为主站配置 SSL(example.com)
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL 证书路径
ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
# 推荐的 SSL 安全参数
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
# HSTS 强制浏览器后续请求使用 HTTPS(谨慎启用)
add_header Strict-Transport-Security "max-age=31536000" always;
# 站点根目录与默认页面
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 日志记录
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
为博客站点配置 SSL(blog.example.org)
server {
listen 443 ssl http2;
server_name blog.example.org;
ssl_certificate /etc/nginx/ssl/blog.example.org/blog.example.org.crt;
ssl_certificate_key /etc/nginx/ssl/blog.example.org/blog.example.org.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=31536000" always;
root /var/www/blog;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 动态请求处理(假设使用 PHP-FPM)
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存优化
location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
access_log /var/log/nginx/blog.example.org.access.log;
error_log /var/log/nginx/blog.example.org.error.log;
}
✅ 提示:启用 HTTP/2 可显著提升网页加载性能,但需确保客户端和证书支持。
第三步:启用配置并测试
创建软连接,将配置从 sites-available 启用至 sites-enabled:
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ ln -s /etc/nginx/sites-available/blog.example.org /etc/nginx/sites-enabled/
检测配置语法是否正确:
nginx -t
若输出显示 “syntax is ok” 和 “test is successful”,则可安全重载服务:
systemctl reload nginx
两个域名均已通过 HTTPS 正常对外提供服务。
注意事项与最佳实践
-
监听端口无冲突
多个server块均可监听443端口,Nginx 会依据server_name和 SNI 字段自动匹配对应证书,无需担心端口占用问题。 -
依赖 SNI 技术
SNI 允许服务器在同一 IP 上返回不同证书,绝大多数现代浏览器和操作系统均已支持 SNI,但对极老设备(如 Windows XP + IE6)可能存在兼容性限制。 -
统一全局 SSL 设置(推荐)
为减少重复配置,可在http { }块中定义通用安全策略:http { ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 包含具体站点配置 include /etc/nginx/sites-enabled/*; }子
server块中可省略这些共用指令,提高可维护性。 -
强制 HTTP 跳转 HTTPS
为每个


