Nginx 反向代理与 HTTPS 配置实战记录
本站最近正式启用了 HTTPS。整个过程比想象中顺利,但中间还是踩了几个小坑,这里把完整流程记录下来,方便以后复现。
一、为什么一定要上 HTTPS
- 浏览器会把 HTTP 站点标记为"不安全",影响观感;
- HTTPS 加密传输,避免内容在链路上被篡改或插入广告;
- HTTP/2、Service Worker 等新特性基本都要求 HTTPS 环境。
二、申请证书
云厂商一般都提供免费的 DV 证书,在控制台提交域名、完成 DNS 验证后即可签发。下载时选择 Nginx 格式,会得到两个关键文件:
xxx_bundle.pem:证书 + 中间证书链;xxx.key:私钥,务必妥善保管,服务器上建议权限设为 600。
我把它们统一放在 /etc/nginx/ssl/域名/ 目录下,方便管理多个站点的证书。
三、Nginx 配置
核心配置其实很短,一个 443 的 server 块加上 80 到 443 的跳转就够了:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.com/example.com_bundle.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/example.com;
index index.html;
}
几个注意点:
ssl_protocols只保留 TLSv1.2 和 TLSv1.3,老协议有已知漏洞;- 证书文件要用包含中间证书的 bundle 版本,否则部分手机浏览器会报证书链不完整;
- 改完先
nginx -t检查语法,再systemctl reload nginx,避免直接重启。
四、验证
配置生效后,可以用两条命令快速验证:
# 查看证书是否正常送达
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -subject -dates
# 检查 HTTP 是否 301 到 HTTPS
curl -sI http://www.example.com/ | head -3
五、踩过的坑
第一次配置时只上传了域名证书、没传中间证书,结果电脑浏览器正常、部分安卓机报"证书不受信任"。换用 bundle 文件后解决。证书链完整性对移动端兼容性影响很大。
另外记得在云平台控制台确认 443 端口的安全组已经放行——这个坑我踩了整整半小时才发现。
六、小结
HTTPS 部署本身不难,核心是证书链完整、协议版本收紧、跳转规则清晰。下一步计划研究证书自动续期,避免过期导致站点打不开。