直接升级一时爽,服务宕机火葬场
以下对正在升级的机器简称为目标机器,将要升级的软件版本简称为目标版本
升级前准备
1. 下载目标版本nginx源码包,这里举例使用nginx-1.15.9
2. 升级前到生产环境服务器查看当前版本的编译参数,然后采用相同编译参数进行源码编译测试,检查是否能够正常编译,若无法正常编译可考虑更换目标版本
平滑升级方法
非集群机器平滑升级
1. 上传目标版本源码包到目标机器
2. ** 备份当前版本nginx
3. 通过命令查看当前版本的nginx编译参数(需要注意的是检查编译参数内是否存在一些含有路径的外部库,并检查服务器是否有存留相关库)
/path/to/nginx -V # 查看编译参数
4. 解压目标版本软件包,进入当前目标版本的源码目录,使用上一步获取的编译参数,包括prefix参数必须相同(平滑升级需要),配置并编译完成后,不需要执行make install
tar -zxf /path/to/nginx-1.15.9.tar.gz # 解压压缩包
cd /path/to/nginx-1.15.9/ # 进入源码目录
configure --prefix=/path/to/ ... # 配置参数
make # 编译
5. 进入当前源码目录下的objs,拷贝objs内的nginx程序文件至当前版本nginx命令的目录覆盖即可
cp -a ./objs/nginx /path/to/nginx
注意:由于此时原版本nginx正在运行中,所有程序、配置等数据均在内存中,覆盖原版本程序文件不会影响当前nginx进程,但此时不能kill掉nginx进程。
6. 查看原版本nginx进程
ps -ef | grep nginx
7. 下面开始进入平滑升级阶段,通过nginx内置的USR2信号机制,开启两个版本的进程
kill -USR2 11830 # 11830是上图中的原版本nginx主进程
通过ps命令查看由nginx的USR2信号启动的目标版本的进程,可以看出主进程5788是由11830启动
8. 此时访问web服务会随机分配至两个版本的进程,为了验证新版本是否能够正常服务,依然通过nginx的WITCH信号逐步关闭原版本的nginx子进程,指保留原版本主进程
kill -WITCH 11830
通过ps命令查看WITCH信号关闭的原版本的子进程
9. 此时访问nginx服务,检查服务是否正常服务,请求响应、各模块功能、日志等,如果没有问题则可以杀掉原版本nginx主进程,完成平滑升级
kill 11830
10. 如果存在问题,则可以立刻通过nginx HUP信号回复原版本nginx进程,再停掉目标版本进程,使用备份恢复原版本nginx程序文件
kill -HUP 11830 && kill 5788
集群机器升级
1. 停止负载对目标机器的流量分发
2. 直接升级一时爽,一直直接升级一直爽
3. 验证服务正常,重新挂到负载,并依次进行升级集群内机器