文章目录
- 前言
- 一、环境准备
- 二、热部署步骤
- 总结
前言
Nginx由于其高并发、高性能、可扩展性好、高可靠性、热部署、BSD许可证等优势被广泛使用,本人主要针对热部署的部分展开说明热部署的具体步骤以及步骤背后发生的具体事情。
本次热部署采用的Nginx版本号为,旧版本Nginx为1.24.0,新版本为1.26.0
一、环境准备
- 下载Nginx源码包,下载链接如下:
- 上传下载的源码包到服务器(本次上传路径为/data/ivan/packages)
- 解压nginx-1.24.0的压缩包
tar -zxvf nginx-1.24.0.tar.gz
- 解压完成后如下图
- 编译安装Nginx-1.24.0
cd nginx-1.24.0/
./configure --prefix=/data/ivan/nginx-1.24.0
make && make install
- 启动Nginx
cd /data/ivan/nginx-1.24.0/
./sbin/nginx
二、热部署步骤
- 将旧Nginx二进制文件换成新Nginx二进制文件(注意备份)
# 进入源码包存放路径,解压nginx-1.26.0压缩包
cd /data/ivan/packages/
tar -zxvf nginx-1.26.0.tar.gz
# 编译新版Nginx二进制文件(这里的编译参数必须与旧Nginx二进制文件的编译参数保持一致)
./configure --prefix=/data/ivan/nginx-1.24.0
make
# 进入nginx二进制存放目录,备份旧Nginx二进制文件
cd /data/ivan/nginx-1.24.0
cp nginx nginx.old
# 用新编译的二进制文件覆盖原二进制文件,必须使用-f参数,否则无法覆盖
cp -rp objs/nginx /data/ivan/nginx-1.24.0/sbin/ -f
- 向master进程发送USR2信号
# 通过ps命令查看Nginx的master进程的pid
ps -ef | grep nginx
发送信号前,Nginx只有一个Master进程:
# 向master进程发送USR2信号
kill -USR2 9893
发送信号后,Nginx的Master进程变成两个,并且可以看出,新Master进程是旧Master进程的子进程
此时,旧nginx进程仍然在LISTEN,只是不会去处理这个socket,因为没有把它加到epoll中。master进程打开监听端口,但不处理,由worker进程处理。另外,旧master是新master的父进程,所以新master才能共享打开的监听端口。
同时,旧Master进程的旧pid文件会变成nginx.pid.oldbin,新Master进程的pid文件会写进nginx.pid
- 向旧Master进程发送WINCH信号
执行如下命令:
kill -WINCH 9893
执行完成后再次查看nginx进程,会发现旧Master进程的worker进程已经停止工作,旧Master进程仍在运行,说明所有的请求已全部切换到新的Master进程。
但是我们发现旧的Master进程没有自动退出,这是因为有可能升级Nginx之后会出现一些问题,保留这个Master进程是为了在有问题的情况下,可以向旧的Master进程发送RELOAD命令(对应HU信号),把旧的Worker进程重新拉起来,实现版本回滚。回滚方式如下:
# 向老Master进程发送HUP信号
kill -HUP 9893
# 向新Master进程发送QUIT信号
kill -QUIT 12682
- 向旧Master进程发送QUIT信号
kill -QUIT 9893
执行完成后再次查看nginx进程,可以发现现在只剩新Master进程及其worker进程正在运行,旧Master进程已完全退出,Nginx升级完成(这里进程号发生变化是因为在这之前测试了下重启步骤,重新执行升级步骤导致新Master进程号发生变化)
总结
Nginx提供了非常便捷的热重载的升级方式,能有效保证服务不中断的情况下执行Nginx的升级任务,并且提供了快速的回退方法,这对业务容忍度很低的业务系统来说是非常好用的功能。