全站HTTPS零中断平滑迁移需双协议共存、分阶段切流、证书热更新及可观测回退;Nginx同server块监听80/443端口,按路径/请求头灰度跳转,reload加载新证书不中断连接,日志监控并支持秒级回退。

要实现全站 HTTPS 零中断平滑迁移,关键是让 HTTP 和 HTTPS 同时可用、流量可渐进切换、配置变更不重启进程、证书更新不中断连接。整个过程不依赖前端改代码,也不要求用户刷新或重试。
双协议共存:HTTP 与 HTTPS 同时监听
在同一个 server 块中同时开启 80 和 443 端口,复用相同域名:
server {
listen 80;
listen 443 ssl;
server_name example.com;
# HTTPS 必需项
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# 可选:HTTP 请求自动跳转 HTTPS(上线后启用,初期可暂不加)
# if ($scheme = http) { return 301 https://$host$request_uri; }
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}分阶段启用 HTTPS 流量
不要一上来就全局 301 跳转,而是按需控制:
- 初期:只对特定路径(如
/login,/api)加return 301 https://...,验证核心链路 - 中期:按请求头或 Cookie 灰度,例如只对带
X-Force-HTTPS: 1的请求跳转 - 后期:全局启用
return 301,并开启 HSTS(add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;)
证书热更新与自动续期保障
Let’s Encrypt 等自动续期工具生成新证书后,只需确保:
- 新
.pem和.key文件已覆盖原路径 - 文件权限为
600,属主与 Nginx worker 进程一致(如www-data) - 执行
nginx -t && nginx -s reload,Nginx 会立即加载新证书,旧连接不受影响
可观测与回退机制
加一条自定义日志格式,跟踪协议实际使用情况:
log_format https_migrate '$time_local $scheme $request_uri $status "$http_user_agent"'; access_log /var/log/nginx/https_migrate.log https_migrate;
若发现大量 http 请求失败或 TLS 握手异常,可临时注释 listen 443 ssl 并 reload,秒级回退到纯 HTTP 模式。
不复杂但容易忽略


















