[TOC] #### 1. 升級需求 --- 為了方便測試,本文使用的是虛擬機軟件,系統環境如下所示: | 名稱 | 描述 | 文章 | | ------------ | ------------ | ------------ | | Oracle VM VirtualBox | 虛擬機軟件 | [VirtualBox 使用介紹](http://www.financialfreedom4us.com/index/627.html) | | CentOS-7-x86_64-Minimal-2009.iso | CentOS 7.9 最小化安裝鏡像文件 | [VirtualBox 安裝 CentOS 7](http://www.financialfreedom4us.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 ``` ![](https://img.itqaq.com/art/content/f1804a6fd68216d6e55a77fc536be5b9.png) #### 5. nginx 模塊的新增和刪除 --- 如果 nginx 已經安裝完成,后期我們想做一些添加模塊和去除模塊的相關操作,我們應該怎么去做 ? 其實,和版本升級幾乎一樣,重新配置參數,進行編譯,最后使用 make 升級命令即可 首先,運行以下命令查看當前模塊安裝情況 因為我是使用 `./configure` 直接運行的,沒有添加任何參數,所以 `configure arguments` 后面沒有內容 ```bash /usr/local/nginx/sbin/nginx -V ``` ![](https://img.itqaq.com/art/content/9c720c93991e79e77e9240fda5661fa0.png) 第一步:進入源碼目錄,進行參數配置和編譯,不需要安裝 ```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 ``` ![](https://img.itqaq.com/art/content/bf92bd72729a7a7fc93f4b8266db8022.png)