Nginx平滑升级

直接升级一时爽,服务宕机火葬场

以下对正在升级的机器简称为目标机器,将要升级的软件版本简称为目标版本

升级前准备

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. 验证服务正常,重新挂到负载,并依次进行升级集群内机器

本文分享自微信公众号 - 可回收BUG(way-of-full-stack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券