Nginx配置多个SSL证书实现多域名安全通信的完整指南
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
美国云虚拟主机 助力出海企业低成本上云 WAF网站防火墙 为您的业务网站保驾护航
随着现代 Web 应用架构的演进,单台服务器托管多个网站已成为常态,尤其在业务规模不断扩展的背景下,一台 Nginx 服务器往往需要同时支持多个独立域名或子域名(如 example.com
、blog.example.com
、shop.anotherdomain.com
),而每个站点都应启用 HTTPS 加密通信以保障用户数据安全,这就要求我们能够在同一台 Nginx 实例上为不同域名配置各自的 SSL/TLS 证书。
本文将系统讲解如何在 Nginx 中高效配置多个 SSL 证书,涵盖从证书申请、文件管理到虚拟主机配置、自动化维护及安全加固的全流程,帮助运维人员构建稳定、安全且易于维护的多站点 HTTPS 架构。
为什么需要为多个域名配置独立的 SSL 证书?
HTTPS 不再是“高级选项”,而是现代网站部署的基本标准,SSL/TLS 协议通过加密客户端与服务器之间的传输数据,有效防止中间人攻击、会话劫持和敏感信息泄露。
当一台服务器承载多个不同域名时,通常每个域名都需要拥有独立的 SSL 证书,虽然通配符证书(Wildcard Certificate)可以覆盖某个主域名下的所有一级子域名(*.example.com
),但它无法跨域使用——对于完全不相关的域名(如 anotherdomain.com
),仍需单独配置证书。
采用多证书策略的优势包括:
-
✅ 更高的安全性隔离
各域名使用独立证书,一旦某一张证书被泄露或吊销,不会波及其他站点,降低连锁风险。 -
✅ 灵活的生命周期管理
每个证书可独立更新、续期或撤销,便于按项目或团队进行权限划分和运维操作。 -
✅ 充分利用 SNI 技术
现代浏览器普遍支持 服务器名称指示(Server Name Indication, SNI) 扩展,允许在同一 IP 地址和端口上绑定多个 SSL 证书,极大提升了资源利用率。
⚠️ 注意:SNI 虽已广泛支持,但极少数老旧设备(如 Windows XP 上的 IE6)可能无法识别,生产环境若需兼容此类客户端,建议分配独立公网 IP。
准备工作:获取并组织 SSL 证书
在开始 Nginx 配置前,必须为每个目标域名准备有效的 SSL 证书,常见获取方式如下:
方式 | 特点 | 适用场景 |
---|---|---|
Let’s Encrypt 免费证书 | 自动化程度高,有效期 90 天,支持自动续签 | 生产环境首选,适合大多数中小型项目 |
商业 CA 签发证书(DigiCert、GeoTrust、Comodo 等) | 更长有效期(1–2 年)、更高信任等级、支持企业验证(EV) | 对品牌信任度要求高的大型平台 |
自签名证书 | 无需外部依赖,生成简单 | 仅限测试或内网开发环境,不适用于公开服务 |
示例:使用 Certbot 申请 Let’s Encrypt 证书
假设我们需要为两个域名申请证书:
# 为主站及其 www 子域名申请证书 sudo certbot certonly --nginx -d example.com -d www.example.com # 为另一个独立博客站点申请证书 sudo certbot certonly --nginx -d blog.anotherdomain.com
执行成功后,证书将自动存储于以下路径:
/etc/letsencrypt/live/example.com/fullchain.pem
—— 证书链/etc/letsencrypt/live/example.com/privkey.pem
—— 私钥文件
同理,blog.anotherdomain.com
的证书也位于对应目录下。
🔐 安全提示:私钥文件(
privkey.pem
)极其敏感,请确保其权限设置为600
,且仅root
用户可读写:chmod 600 /etc/letsencrypt/live/*/privkey.pem chown root:root /etc/letsencrypt/live/*/privkey.pem
核心实现:Nginx 多域名 SSL 配置详解
Nginx 使用 server 块(虚拟主机) 来区分不同的网站请求,每个 server
可监听相同的端口(443),并通过 server_name
和 SSL_certificate
指令指定对应的域名与证书路径。
基本配置结构说明
Nginx 主配置文件通常位于 /etc/nginx/nginx.conf
,但推荐将各个站点的配置拆分为独立文件,存放在 /etc/nginx/sites-available/
目录中,并通过符号链接激活至 /etc/nginx/sites-enabled/
。
配置第一个域名(example.com)
server { listen 443 ssl http2; server_name example.com www.example.com; # SSL 证书路径 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 推荐的安全协议与加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; # 站点根目录与默认页面 root /var/www/example; index index.html; # 请求处理规则 location / { try_files $uri $uri/ =404; } # 启用访问与错误日志(便于排查) access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; }
添加第二个域名(blog.anotherdomain.com)
server { listen 443 ssl http2; server_name blog.anotherdomain.com; ssl_certificate /etc/letsencrypt/live/blog.anotherdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/blog.anotherdomain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; root /var/www/blog; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP-FPM 动态解析 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } access_log /var/log/nginx/blog.access.log; error_log /var/log/nginx/blog.error.log; }
💡 提示:两个
server
块共享同一个 IP 和端口(443),依靠 SNI 在握手阶段判断客户端请求的是哪个域名,从而返回正确的证书。
强制 HTTP 跳转 HTTPS(提升安全性)
为了强制所有流量走加密通道,建议为每个域名配置一个监听 80 端口的 server
块,执行 301 永久重定向:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } server { listen 80; server_name blog.anotherdomain.com; return 301 https://$host$request_uri; }
此设计不仅提升安全性,也有利于 SEO——搜索引擎更青睐始终使用 HTTPS 的网站。
验证与测试流程
完成配置后,务必进行以下验证步骤,确保服务正常运行且符合安全规范。
检查 Nginx 配置语法
sudo nginx -t
输出应显示 syntax is ok
和 test is successful
,否则需检查配置中的拼写或路径错误。
重新加载 Nginx 服务
sudo systemctl reload nginx
避免使用 restart
,以免造成短暂中断。
浏览器访问测试
分别打开:
https://example.com
https://blog.anotherdomain.com
确认页面正常加载,并观察浏览器地址栏是否显示锁形图标,点击可查看证书详情。
使用专业工具检测 SSL 安全等级
访问 [SSL Labs SSL Test](https://www.ssll