nginx热升级
nginx热升级
热升级原理
通过 信号控制 和 多进程协作 实现无缝切换:
- 旧进程:保持处理现有连接。
- 新进程:加载新二进制和配置,接管新请求。
- 优雅退出:旧进程完成存量请求后退出。
标准热升级流程
1. 准备工作
# 查看当前进程和版本
ps aux | grep nginx
nginx -v
# 备份旧二进制和配置
cp /usr/sbin/nginx /usr/sbin/nginx_old
cp -r /etc/nginx /etc/nginx_backup
2. 替换新二进制
# 上传新二进制文件(需与旧版编译参数一致)
chmod +x nginx_new
mv nginx_new /usr/sbin/nginx
# 验证新版本
nginx -t # 测试配置文件
nginx -v # 检查版本
3. 触发热升级
# 向主进程发送 USR2 信号(启动新进程)
kill -USR2 $(cat /var/run/nginx.pid)
# 此时会生成新主进程,旧进程转为 Worker 不再接收新请求
ps aux | grep nginx
输出示例:
root 1234 0.0 0.1 10000 2000 ? Ss 10:00 0:00 nginx: master process (old)
root 5678 0.0 0.1 10000 2000 ? Ss 10:05 0:00 nginx: master process (new)
nginx 9012 0.0 0.1 10000 2000 ? S 10:00 0:00 nginx: worker process (old)
nginx 9013 0.0 0.1 10000 2000 ? S 10:05 0:00 nginx: worker process (new)
4. 优雅关闭旧进程
# 向旧主进程发送 WINCH 信号(停止 Worker)
kill -WINCH $(cat /var/run/nginx.pid.oldbin)
# 等待旧 Worker 处理完存量请求后,关闭旧 Master
kill -QUIT $(cat /var/run/nginx.pid.oldbin)
关键信号说明
| 信号 | 作用 |
|---|---|
USR2 |
启动新主进程,保留旧进程 |
WINCH |
关闭旧 Worker(旧 Master 仍存在) |
QUIT |
优雅退出旧 Master |
HUP |
重载配置(无需重启) |
热升级验证
# 检查新进程状态
netstat -tunlp | grep nginx
# 测试服务功能
curl -I http://localhost
# 监控日志
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
回滚方案
如果新版本异常,快速回退到旧版本:
# 1. 恢复旧二进制
mv /usr/sbin/nginx_old /usr/sbin/nginx
# 2. 向新主进程发送 QUIT 信号(强制终止)
kill -QUIT $(cat /var/run/nginx.pid)
# 3. 重启旧进程
nginx -c /etc/nginx/nginx.conf
# 4. 确认旧进程恢复
ps aux | grep nginx
注意事项
-
ABI 兼容性
- 新旧二进制文件的 编译参数 和 依赖库版本 必须一致。
- 验证命令:
ldd /usr/sbin/nginx
-
配置文件兼容性
- 新旧版本配置语法需兼容,建议先测试
nginx -t
- 新旧版本配置语法需兼容,建议先测试
-
资源预留
- 确保系统有足够内存同时运行新旧进程
-
监控指标
- 观察升级后的内存、CPU、连接数变化
- 使用命令:
ss -s、vmstat 1
自动化脚本示例
#!/bin/bash
# 热升级脚本 (nginx为例)
OLD_PID=$(cat /var/run/nginx.pid)
cp nginx_new /usr/sbin/nginx
nginx -t || exit 1
kill -USR2 $OLD_PID
sleep 5
kill -WINCH $OLD_PID
kill -QUIT $OLD_PID
echo "Upgrade completed. New PID: $(cat /var/run/nginx.pid)"
通过此方案,您可以在不影响线上服务的情况下完成二进制升级,特别适合 7x24 小时运行 的关键业务系统。
浙公网安备 33010602011771号