问题
如果想对Nginx的版本进行更新,或者要应用一些新的模块,最简单的做法就是停止当前的Nginx服务,然后开启新的Nginx服务。但是这样会导致在一段时间内,用户是无法访问服务器。为了解决这个问题,我们就需要用到Nginx服务器提供的平滑升级
功能。这个也是Nginx的一大特点,使用这种方式,就可以使Nginx在7*24小时不间断的提供服务了。
接下来我们分析下需求:
需求:Nginx的版本最开始使用的是Nginx-1.18.0,由于服务升级,需要将Nginx的版本升级到Nginx-1.20.2,要求Nginx不能中断提供服务。
为了应对上述的需求,提供两种解决方案:
方案一:使用Nginx服务信号完成Nginx的升级
方案二:使用Nginx安装目录的make命令完成升级
环境准备
-
先准备两个版本的Nginx分别是1.18.0和1.20.2
-
使用Nginx源码安装的方式将1.18.0版本安装成功并正确访问
# 进入安装目录
/configure
make && make install
- 将Nginx1.20.2进行参数配置和编译,不需要进行安装。
# 进入安装目录
./configure
make
使用Nginx服务信号进行升级
- 将1.18.0版本的sbin目录下的nginx进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold
- 第二步:将Nginx1.20.2安装目录编译后的objs目录下的nginx文件,拷贝到原来/usr/local/nginx/sbin目录下
cd ~/nginx/core/nginx-1.20.2/objs 2 cp nginx /usr/local/nginx/sbin
-
发送信号USR2给Nginx的1.18.0版本对应的master进程
发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,
并且新的master进程的PID会被记录在/usr/local/nginx/logs/nginx.pid
而之前的旧的master进程 PID 会被记录在/usr/local/nginx/logs/nginx.pid.oldbin
文件中
接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭 -
发送信号QUIT给Nginx的1.18.0版本对应的master进程
kill -QUIT `more /usr/local/logs/nginx.pid.oldbin`
使用Nginx安装目录的make命令完成升级
- 将1.18.0版本的sbin目录下的nginx进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold
- 将Nginx1.20.2安装目录编译后的objs目录下的nginx文件,拷贝到原来/usr/local/nginx/sbin目录下
cd ~/nginx/core/nginx-1.20.2/objs
cp nginx /usr/local/nginx/sbin
-
进入到安装目录,执行make upgrade
-
查看是否更新成功
./nginx -v