[TOC] #### 1. 升级需求 --- 为了方便测试,本文使用的是虚拟机软件,系统环境如下所示: | 名称 | 描述 | 文章 | | ------------ | ------------ | ------------ | | Oracle VM VirtualBox | 虚拟机软件 | [VirtualBox 使用介绍](https://www.itqaq.com/index/627.html) | | CentOS-7-x86_64-Minimal-2009.iso | CentOS 7.9 最小化安装镜像文件 | [VirtualBox 安装 CentOS 7](https://www.itqaq.com/index/628.html) | 如果想要对 nginx 的版本进行更新,或者要添加一些新的模块,最简单的做法就是停止当前 nginx 服务,然后开启新的 nginx 服务,但是这样会导致在一段时间内,用户无法访问服务器。 无法访问的这段时间对于一些访问量比较多系统的损失是非常大的,比如:京东、支付宝 每时每刻都有用户访问 为了解决这个问题,我们就需要用到 nginx 服务器提供的平滑升级功能,这也是 nginx 的一大特点,使用这种方式,就可以使 nginx 不间断的提供服务,接下来我们分析下需求: 当前 nginx 版本为 nginx-1.20.2,由于服务升级,需要将 nginx 的版本升级到 nginx-1.24.0,要求 nginx 不能中断服务 为了应对上述需求,本文提供两种解决方案:使用 nginx 服务信号完成升级、使用 nginx 源码目录的 make 命令完成升级 #### 2. 环境准备 --- 第一步:先准备两个版本的 nginx,本文使用的是 1.20.2 和 1.24.0 ```bash # 进入源码包存放目录 cd /usr/local/src # 拉取源码包 yum install wget -y wget https://nginx.org/download/nginx-1.20.2.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz # 解压源码包 tar -zxf nginx-1.20.2.tar.gz tar -zxf nginx-1.24.0.tar.gz ``` 第二步:使用 nginx 源码安装的方式将 1.20.2 版本安装成功并且能正常访问 补充:如果没有指定 nginx 安装目录,则默认的安装路径为: `/usr/local/nginx` ```bash # 安装 nginx 所需依赖包 yum install gcc pcre pcre-devel zlib zlib-devel -y # 编译安装 cd /usr/local/src/nginx-1.20.2 ./configure make && make install # 启动 nginx 服务 /usr/local/nginx/sbin/nginx # 关闭防火墙 systemctl stop firewalld # 关闭防火墙开机自启 systemctl disable firewalld ``` 第三步:将 nginx 1.24.0 进行参数配置和编译,不需要安装 ```bash cd /usr/local/src/nginx-1.24.0 ./configure make ``` 运行 `make` 命令之后,会生成 `Makefile` 文件和 `objs` 目录,`objs/nginx` 是 1.24.0 版本的可执行的二进制文件 ```bash /usr/local/src/nginx-1.24.0/objs/nginx -v ``` #### 3. 使用服务信号升级 --- 第一步:将 nginx 安装目录中的 sbin 目录下的可执行的二进制文件进行备份 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold ``` 第二步:将新版本安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来 `/usr/local/nginx/sbin` 目录下 ```bash cp /usr/local/src/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin ``` 第三步:给当前版本的 master 进程发送 USR2 信号 ```bash kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` ``` 第四步:给当前版本的 master 进程发送 QUIT 信号 ```bash kill -QUIT `more /usr/local/nginx/logs/nginx.pid.oldbin` ``` #### 4. 使用 make 命令升级 --- **温馨提示:【使用 make 命令升级】和【使用服务信号升级】的前两步是一样的** 第一步:将 nginx 安装目录中的 sbin 目录下的可执行的二进制文件进行备份 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold ``` 第二步:将新版本安装目录编译后的 objs 目录下的 nginx 文件,拷贝到原来 `/usr/local/nginx/sbin` 目录下 ```bash cp /usr/local/src/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin ``` 第三步:进入 nginx 的新版本源码目录,运行以下命令即可完成 nginx 的升级 通过查看命令输出可以发现,这种方式本质上也是使用 nginx 服务器信号控制升级的 ```bash cd /usr/local/src/nginx-1.24.0 make upgrade ```  #### 5. nginx 模块的新增和删除 --- 如果 nginx 已经安装完成,后期我们想做一些添加模块和去除模块的相关操作,我们应该怎么去做 ? 其实,和版本升级几乎一样,重新配置参数,进行编译,最后使用 make 升级命令即可 首先,运行以下命令查看当前模块安装情况 因为我是使用 `./configure` 直接运行的,没有添加任何参数,所以 `configure arguments` 后面没有内容 ```bash /usr/local/nginx/sbin/nginx -V ```  第一步:进入源码目录,进行参数配置和编译,不需要安装 ```bash cd /usr/local/src/nginx-1.24.0 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module make ``` 第二步:将 `objs/nginx` 文件拷贝到 `/usr/local/nginx/sbin` 目录中 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold cp /usr/local/src/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin ``` 第三步:运行以下命令就可以进行平滑更新模块,不会中断 nginx 服务 ```bash make upgrade ``` 第四步:检查模块是否添加成功,可以发现模块已经添加成功了 ```bash /usr/local/nginx/sbin/nginx -V ``` 