主备切换时https会话状态不丢失的关键在于统一ssl会话缓存与票据密钥、禁用证书路径硬编码、启用ocsp stapling并共用可信链,以及vip漂移后延迟加载nginx确保连接复用。

主备切换时 HTTPS 会话状态不丢失,关键不是“同步会话”,而是让新节点能无缝承接已建立的加密连接——TLS 层本身不支持跨节点状态迁移,必须靠配置规避依赖、提升复用率、缩短重建代价。
统一 SSL 会话缓存与票据密钥
所有 Nginx 节点必须使用完全一致的会话管理配置,否则客户端提交的 ticket 或尝试复用 session ID 会被新节点拒绝:
- ssl_session_cache 必须放在 http 块顶层,且名称、大小完全相同,例如:
ssl_session_cache shared:SSL:20m; - ssl_session_ticket_key 文件需在主备节点上内容完全一致(不能各自生成),建议通过配置中心或 Ansible 统一分发,首次可用:
openssl rand 48 > /etc/nginx/ticket.key - ssl_session_timeout 设为 4h 或更长,避免切换后因超时导致强制完整握手
禁用绑定主机名的证书路径
容灾切换失败常源于证书路径硬编码。若配置中写 ssl_certificate /etc/ssl/nginx-example.com.crt,备用节点可能无此文件或权限不同:
- 所有节点统一私钥和证书路径,如固定为
/etc/ssl/private/nginx.key和/etc/ssl/certs/nginx.pem - 避免在配置中拼接变量或主机名;证书续期脚本也应写死路径,不依赖域名动态生成
启用 OCSP Stapling 并共用可信链
主备切换瞬间若客户端需自行验证证书吊销状态,网络抖动或 DNS 不稳会导致 TLS 握手卡顿甚至失败:
- 主备节点均启用
ssl_stapling on;和ssl_stapling_verify on; -
ssl_trusted_certificate指向同一份完整信任链(含中间 CA + 根 CA),确保 stapling 响应一致可复用 - resolver 配置相同(如
resolver 1.1.1.1 8.8.8.8 valid=300s;),避免 DNS 解析差异影响装订时效
Keepalived 切换时保护活跃连接
VIP 漂移本身不中断 TLS 连接,但 Nginx 进程未就绪或内核路由未生效会导致连接重置:
- 在 Keepalived 的 notify script 中,VIP 绑定后增加 2–3 秒延迟再执行
nginx -s reload或启动服务,确保路由表和连接跟踪状态稳定 - 主节点检测失败时,用
vrrp_script执行真实 HTTP 探活(如curl -I http://127.0.0.1/health -w "%{http_code}"),而非仅检查进程存在 - 备节点 Nginx 启动后,确认
ssl_session_cache已加载(可通过nginx -t和日志验证),再允许 VIP 切入











