nginx为虚拟主机启用基础https需三步:一是部署合法ssl证书(如certbot自动获取或手动放置.pem/.key文件并设权限);二是为每个域名单独配置含listen 443 ssl、ssl_certificate、ssl_certificate_key的server块;三是添加80端口return 301跳转及ssl_protocols、ssl_ciphers等安全参数,最后nginx -t验证后reload生效。

要在 Nginx 中为虚拟主机启用基础 HTTPS 访问,核心是为每个域名单独配置 SSL 证书,并在 server 块中正确声明监听、证书路径和安全参数。这不是“加个开关”就能生效的事,而是涉及证书部署、配置对齐与协议兼容性三个关键环节。
确保域名已绑定有效 SSL 证书
HTTPS 不是靠 Nginx 自己生成的,必须提前获取并部署合法证书:
- 推荐使用 Certbot(Let’s Encrypt)自动申请:运行
certbot --nginx -d example.com -d www.example.com,它会自动下载证书、更新 Nginx 配置并设置自动续期; - 手动部署时,把
.pem(证书)和.key(私钥)文件放到统一目录(如/etc/letsencrypt/live/example.com/),注意权限设为644和600; - 务必确认证书的 Subject Alternative Name(SAN)包含你配置的所有域名(如同时覆盖
example.com和www.example.com),否则浏览器会报“证书不匹配”。
为每个域名写独立的 HTTPS server 块
不要试图在一个 server 块里塞多个域名再硬配 HTTPS——SNI 协商只认第一个 server_name 对应的证书。正确做法是为每个主域名(含 www 变体)分别建块:
- 一个块专用于
example.com和www.example.com的 HTTPS 主服务; - 另一个块处理
shop.example.com,用它自己的证书路径; - 所有 HTTPS 块都必须写
listen 443 ssl;,不能混用listen 443;(无 ssl)和listen 443 ssl;,否则匹配逻辑会出错。
配置必需的 SSL 参数与跳转规则
光有证书还不够,需补充基础安全参数并强制 HTTP 跳转:
- 在 server 块内加入:
ssl_certificate和ssl_certificate_key指向对应证书文件; - 添加常用安全项:如
ssl_protocols TLSv1.2 TLSv1.3;、ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;; - 必须配置 HTTP → HTTPS 强制跳转:另建一个
listen 80;的 server 块,用return 301 https://$host$request_uri;实现无缝重定向。
验证与热加载配置
改完别直接 reload,先验证语法再上线:
- 执行
nginx -t检查配置是否合法; - 确认证书路径可读(Nginx 进程用户如
nginx或www-data要有权限读取 .key 文件); - 运行
systemctl reload nginx生效,然后用浏览器或curl -I https://example.com测试响应头是否有200 OK和Strict-Transport-Security等安全头。











