nginx热升级https不中断的关键是新旧worker并存:旧worker处理存量tls连接,新worker用新版二进制接管新连接;依赖usr2/winch/quit信号驱动,证书配置不变,tls会话自然延续。

升级 Nginx 版本时保持 HTTPS 会话不中断,关键不是“延续单个 TLS 连接”,而是确保新旧 worker 进程能并存运行、新连接由新版处理、存量连接由旧版自然结束——整个过程对客户端完全透明。只要操作规范,HTTPS 握手、证书验证、加密通信均不受影响。
确认热升级前提条件
平滑升级依赖 Nginx 原生信号机制,不是所有部署方式都支持:
- 必须使用直接二进制启动(如 /usr/local/nginx/sbin/nginx),而非 systemd 管理的
systemctl start nginx;后者无法可靠响应 USR2 信号 - 新版本编译参数需与旧版严格一致:运行
nginx -V查看configure arguments,新编译时完整复用,避免模块缺失或路径错位 - 确保
http_ssl_module已启用:nginx -V 2>&1 | grep with-http_ssl_module输出应含该字符串
执行四步热升级流程
全程无需停服务,旧进程持续处理已有 HTTPS 连接,新进程启动后接管新建连接:
-
备份旧二进制:先保存当前可执行文件,例如
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old -
编译并替换新二进制:解压新源码,按原参数
./configure && make,再复制objs/nginx到/usr/local/nginx/sbin/(不执行make install) -
发送 USR2 启动新 master:运行
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid),此时ps aux | grep nginx可见两组进程(旧 master + worker、新 master + worker) -
优雅退出旧进程:先
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid)让旧 worker 处理完请求后退出;再kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)终止旧 master
HTTPS 相关配置无需改动
证书路径、SSL 参数、TLS 版本等全部保留在 nginx.conf 中,升级前后完全一致:
- 证书文件(
ssl_certificate和ssl_certificate_key)仍由新 master 进程读取,路径不变即自动生效 - 已建立的 HTTPS 连接继续使用原有 TLS 上下文完成通信,不会被强制重握手
- 新连接由新 worker 发起 TLS 握手,使用相同证书和配置,客户端无感知
验证与回滚准备
升级后立即确认状态,同时保留回退能力:
- 检查新 worker 是否正常:运行
ps aux | grep 'nginx: worker',确认进程属新 master - 验证 HTTPS 功能:用
curl -I --insecure https://yoursite.com或浏览器访问,确认返回 200 且证书信息正确 - 保留
nginx.old和旧配置备份,若异常可秒级回滚:mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx && kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)











