[TOC] #### 1. 升級(jí)需求 --- 為了方便測(cè)試,本文使用的是虛擬機(jī)軟件,系統(tǒng)環(huán)境如下所示: | 名稱 | 描述 | 文章 | | ------------ | ------------ | ------------ | | Oracle VM VirtualBox | 虛擬機(jī)軟件 | [VirtualBox 使用介紹](http://beautifulforever.com.cn/index/627.html) | | CentOS-7-x86_64-Minimal-2009.iso | CentOS 7.9 最小化安裝鏡像文件 | [VirtualBox 安裝 CentOS 7](http://beautifulforever.com.cn/index/628.html) | 如果想要對(duì) nginx 的版本進(jìn)行更新,或者要添加一些新的模塊,最簡(jiǎn)單的做法就是停止當(dāng)前 nginx 服務(wù),然后開啟新的 nginx 服務(wù),但是這樣會(huì)導(dǎo)致在一段時(shí)間內(nèi),用戶無(wú)法訪問(wèn)服務(wù)器。 無(wú)法訪問(wèn)的這段時(shí)間對(duì)于一些訪問(wèn)量比較多系統(tǒng)的損失是非常大的,比如:京東、支付寶 每時(shí)每刻都有用戶訪問(wèn) 為了解決這個(gè)問(wèn)題,我們就需要用到 nginx 服務(wù)器提供的平滑升級(jí)功能,這也是 nginx 的一大特點(diǎn),使用這種方式,就可以使 nginx 不間斷的提供服務(wù),接下來(lái)我們分析下需求: 當(dāng)前 nginx 版本為 nginx-1.20.2,由于服務(wù)升級(jí),需要將 nginx 的版本升級(jí)到 nginx-1.24.0,要求 nginx 不能中斷服務(wù) 為了應(yīng)對(duì)上述需求,本文提供兩種解決方案:使用 nginx 服務(wù)信號(hào)完成升級(jí)、使用 nginx 源碼目錄的 make 命令完成升級(jí) #### 2. 環(huán)境準(zhǔn)備 --- 第一步:先準(zhǔn)備兩個(gè)版本的 nginx,本文使用的是 1.20.2 和 1.24.0 ```bash # 進(jìn)入源碼包存放目錄 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 版本安裝成功并且能正常訪問(wèn) 補(bǔ)充:如果沒(méi)有指定 nginx 安裝目錄,則默認(rèn)的安裝路徑為: `/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 # 啟動(dòng) nginx 服務(wù) /usr/local/nginx/sbin/nginx # 關(guān)閉防火墻 systemctl stop firewalld # 關(guān)閉防火墻開機(jī)自啟 systemctl disable firewalld ``` 第三步:將 nginx 1.24.0 進(jìn)行參數(shù)配置和編譯,不需要安裝 ```bash cd /usr/local/src/nginx-1.24.0 ./configure make ``` 運(yùn)行 `make` 命令之后,會(huì)生成 `Makefile` 文件和 `objs` 目錄,`objs/nginx` 是 1.24.0 版本的可執(zhí)行的二進(jìn)制文件 ```bash /usr/local/src/nginx-1.24.0/objs/nginx -v ``` #### 3. 使用服務(wù)信號(hào)升級(jí) --- 第一步:將 nginx 安裝目錄中的 sbin 目錄下的可執(zhí)行的二進(jìn)制文件進(jìn)行備份 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold ``` 第二步:將新版本安裝目錄編譯后的 objs 目錄下的 nginx 文件,拷貝到原來(lái) `/usr/local/nginx/sbin` 目錄下 ```bash cp /usr/local/src/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin ``` 第三步:給當(dāng)前版本的 master 進(jìn)程發(fā)送 USR2 信號(hào) ```bash kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` ``` 第四步:給當(dāng)前版本的 master 進(jìn)程發(fā)送 QUIT 信號(hào) ```bash kill -QUIT `more /usr/local/nginx/logs/nginx.pid.oldbin` ``` #### 4. 使用 make 命令升級(jí) --- **溫馨提示:【使用 make 命令升級(jí)】和【使用服務(wù)信號(hào)升級(jí)】的前兩步是一樣的** 第一步:將 nginx 安裝目錄中的 sbin 目錄下的可執(zhí)行的二進(jìn)制文件進(jìn)行備份 ```bash mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold ``` 第二步:將新版本安裝目錄編譯后的 objs 目錄下的 nginx 文件,拷貝到原來(lái) `/usr/local/nginx/sbin` 目錄下 ```bash cp /usr/local/src/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin ``` 第三步:進(jìn)入 nginx 的新版本源碼目錄,運(yùn)行以下命令即可完成 nginx 的升級(jí) 通過(guò)查看命令輸出可以發(fā)現(xiàn),這種方式本質(zhì)上也是使用 nginx 服務(wù)器信號(hào)控制升級(jí)的 ```bash cd /usr/local/src/nginx-1.24.0 make upgrade ``` ![](https://img.itqaq.com/art/content/f1804a6fd68216d6e55a77fc536be5b9.png) #### 5. nginx 模塊的新增和刪除 --- 如果 nginx 已經(jīng)安裝完成,后期我們想做一些添加模塊和去除模塊的相關(guān)操作,我們應(yīng)該怎么去做 ? 其實(shí),和版本升級(jí)幾乎一樣,重新配置參數(shù),進(jìn)行編譯,最后使用 make 升級(jí)命令即可 首先,運(yùn)行以下命令查看當(dāng)前模塊安裝情況 因?yàn)槲沂鞘褂?`./configure` 直接運(yùn)行的,沒(méi)有添加任何參數(shù),所以 `configure arguments` 后面沒(méi)有內(nèi)容 ```bash /usr/local/nginx/sbin/nginx -V ``` ![](https://img.itqaq.com/art/content/9c720c93991e79e77e9240fda5661fa0.png) 第一步:進(jìn)入源碼目錄,進(jìn)行參數(shù)配置和編譯,不需要安裝 ```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 ``` 第三步:運(yùn)行以下命令就可以進(jìn)行平滑更新模塊,不會(huì)中斷 nginx 服務(wù) ```bash make upgrade ``` 第四步:檢查模塊是否添加成功,可以發(fā)現(xiàn)模塊已經(jīng)添加成功了 ```bash /usr/local/nginx/sbin/nginx -V ``` ![](https://img.itqaq.com/art/content/bf92bd72729a7a7fc93f4b8266db8022.png)