为虚拟主机配置独立SSL证书需为每个域名设独立server块并监听443端口,通过SNI匹配证书;证书路径用绝对路径,私钥权限设为600;HTTP 80端口须301跳转HTTPS;需语法检查、重载,并配置default_server兜底。

为虚拟主机配置独立 SSL 证书,核心是让每个域名拥有专属的 ssl_certificate 和 ssl_certificate_key 指令,且互不干扰。这在 Nginx 中通过“按域名划分 server 块”实现,不是靠条件判断或共享配置。
每个域名必须有独立的 server 块
Nginx 不支持在同一个 server 块内根据 $host 动态切换证书。必须为每个域名单独写一个 server { ... },并各自监听 443 ssl 端口:
server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;server_name blog.example.com;ssl_certificate /etc/nginx/ssl/blog.example.com.crt;ssl_certificate_key /etc/nginx/ssl/blog.example.com.key;
这样 Nginx 才能在 TLS 握手阶段,依据客户端发出的 SNI(Server Name Indication)信息,精准返回对应域名的证书。
证书路径与权限要严格匹配
- 使用绝对路径(如
/etc/nginx/ssl/xxx.crt),避免因工作目录变化导致加载失败 - 私钥文件权限必须设为
600:chmod 600 /etc/nginx/ssl/*.key - 推荐将所有证书统一存放在
/etc/nginx/ssl/下,并按域名命名,便于管理与排查
HTTP 请求必须强制跳转 HTTPS
每个域名还需配一个对应的 HTTP server 块,监听 80 端口,无条件 301 跳转:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
这样既保证用户访问 http:// 时自动升级,也避免混合内容或证书错配风险。
验证与兜底机制不能省
配置后务必执行
nginx -t检查语法,再nginx -s reload生效-
建议添加一个默认 HTTPS server,拦截未匹配域名的请求:
server { listen 443 ssl default_server; server_name _; return 444; }防止非法 SNI 或拼写错误的域名意外落入某个站点配置中
浏览器访问
https://example.com,点击地址栏锁图标查看证书详情,确认主体(Subject)与域名一致命令行验证:
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text | grep "Subject:"
不复杂但容易忽略











