1、热升级
1.1、热升级流程
1.1.1、将旧Nginx文件换成新Nginx文件(注意备份)
- 1、只替换二进制文件。
- 2、大部分场景下,我们新编译的nginx文件所指定的相应的配置选项,比如说配置文件的目录在哪里,log所在的目录在哪里等等,必须保持和老的nginx是一致的,否则我们无法复用nginx conf文件。
- 3、如果我们只替换二进制文件,请注意我们要备份。在替换的时候,新版本的linux中要求你在覆盖一个正在使用的文件时,加上 -f。
1.1.2、向master进程发送USR2信号
现在我们向老的nginx其中master进程发送USR2。发送完USR2信号以后,现有的master进程会做以下几件事。
1.1.2.1、master进程修改pid文件名,加后缀.oldbin
- 1、这样做是为了给新的master进程让路。
- 2、master进程和worker进程,虽然他们都可以接受信号,但是为了管理方便,我们通常不会对worker进程直接发送信号,所以我们依赖于master进程,它必须把它的pid保存下来。
- 3、为了给新的master让它使用pid.bin这样一个文件名,所以我们先把老的pid文件改名。
1.1.2.2、master进程用新Nginx文件启动新master进程
- 1、我们用新的二进制文件启动新的master进程,所以到此为止会出现两个master进程和老的worker进程。
- 2、新的master进程会自动地去启动新的worker进程。
1.1.2.3、向老master进程发送QUIT信号,关闭老master
- 1、怎样找到老的master进程,我们需要用ps看到master进程的进程号或者通过.oldbin文件找到老的master进程的进程号向这个进程号发送信号。
- 2、老的master进程会优雅的关闭老的worker进程。这样的话,我们的热升级就结束了。
1.2、热升级流程图
- 1、如图(从左往右),一开始老的master进程启动了四个绿色的worker进程。
- (1)、当我们更新了nginx的二进制文件以后,向老的master进程发送SIGUSR2信号,这时候老的master进程会把自己的pid文件改名。这时我们认为它是黄色的这样进程。
- (2)、启动新的master进程是怎样起的呢?它起了一个新的子进程,也就是说新的master进程是老的master进程的子进程,但是这个子进程是使用了新的二进制文件载入来启动的。
- (3)、所以上是这样一个流程,在中间的时候,新老nginx并存,但老的master开始关闭监听端口,然后所有的(黄色的)老的worker进程开始优雅地退出。在完成以后,就只有新的master进程存在了。
- 2、以上可以通过热升级实现不停机,更新我们的nginx.
2、回滚
向老master发送HUP,向新master发送QUIT。
2.1、但是老的master进程一直是保存下来的,这是为什么?
=方便我们回滚,也就是发现新的nginx程序有问题了,这时候因为老的master进程还在,所以我们通过向它发送HUP信号,相当于执行了一次reload,它会起新的worker进程,再向新的master发送QUIT信号,也就是要求其对应的新的worker进程优雅的退出,这就实现了一个回滚。
3、操作–热升级
正在运行的ngixn是1.14.2版本的,我想不关闭的情况下,想将版本升级为1.15.0
3.1、下载1.15.0并生成二进制文件
wget http://nginx.org/download/nginx-1.15.0.tar.gz
[root@zhoufei packages]# tar -zxvf nginx-1.15.0.tar.gz
[root@zhoufei packages]# cd nginx-1.15.0
[root@zhoufei nginx-1.15.0]# ./configure --prefix=/usr/local/nginx1.15.0
[root@zhoufei nginx-1.15.0]# make
[root@zhoufei nginx-1.15.0]# make install
3.2、查看版本对比
./sbin/nginx -v
3.3、原二进制文件备份
[root@zhoufei nginx7001]# cp ./sbin/nginx ./sbin/nginx.old
[root@zhoufei nginx7001]# ll ./sbin/
total 7320
-rwxr-xr-x 1 root root 3746760 Nov 17 17:18 nginx
-rwxr-xr-x 1 root root 3746760 Nov 18 09:27 nginx.old
3.4、新版本二进制文件覆盖旧版本二进制文件
[root@zhoufei nginx7001]# cp -f /usr/local/nginx1.15.0/sbin/nginx /usr/local/nginx7001/sbin/nginx
3.5、查看当前版本
[root@zhoufei nginx7001]# ./sbin/nginx -v
- 虽然当前版本已经变成了1.15.0版本,还是旧版本的在工作。
3.6、平滑升级
3.6.1、kill -USR2 旧版本的主进程号(让旧版本的worker进程不再接受请求)
[root@zhoufei nginx7001]# ps -ef | grep nginx
[root@zhoufei nginx7001]# kill -USR2 27177;
可以看到现在有2个master,2个worker,老的进程都存在。
3.6.2、kill -WINCH 旧版本的主进程号(关闭旧版本的worker进程)
[root@zhoufei nginx7001]# kill -WINCH 27177;
- 27177的master进程对应的worker进程(27178)已经被关闭
4、操作–版本的回退
如果升级后有问题可以立即回退来恢复
4.1、先将二进制执行文件还原
[root@zhoufei nginx7001]# cp -f /usr/local/nginx7001/sbin/nginx.old /usr/local/nginx7001/sbin/nginx
4.2、当前进程情况
[root@zhoufei nginx7001]# ps -ef | grep nginx
- 2个master,1个worker,其中27177 master我们要会退的版本.
4.3、kill -HUP 旧版本的进程号(拉起旧版本的worker进程)
[root@zhoufei nginx7001]# kill -HUP 27177;
[root@zhoufei nginx7001]# ps -ef | grep nginx
4.4、kill -WINCH 新版本的主进程号(关闭新版本的worker进程)
[root@zhoufei nginx7001]# kill -WINCH 12152;
[root@zhoufei nginx7001]# ps -ef | grep nginx
4.5、查看版本
如有不懂可以去极客时间参考 22 | Nginx的进程结构实例演示-Nginx核心知识150讲-极客时间