背景:由於負載均衡測試伺服器中nginx版本過低,存在安全漏洞,查詢相關修復漏洞資料,需要採取nginx版本升級形式對漏洞進行修復。
Nginx平滑升級方案
1、案例採用版本介紹
舊版本 nginx-1.12.2.tar.gz
新版本 nginx-1.20.1.tar.gz
2、nginx-1.12.2版本為當前執行版本
設定埠8080和對主頁index.html進行修改,後續進行平滑升級後,依然可以對其訪問。
3、解壓新版本 nginx-1.20.1.tar.gz
編譯安裝至舊版本nginx-1.12.2目錄下,執行原有nginx.conf配置檔案,執行如下:
./configure --prefix=/usr/local/nginx-1.12.2 --conf-path=/usr/local/nginx-1.12.2/nginx.conf --pid-path=/usr/local/nginx-1.12.2/nginx.pid --user=ngadm --group=ngadm --with-http_stub_status_module --without-http_rewrite_module
make && make install
4、完成後1.20.1版本會自動在原sbin目錄下生產新的nginx二進位制檔案,舊的nginx會自動被替換成nginx.old
5、平滑升級
Nginx對程序的控制能力非常強大,可以通過訊號指令控制程序。常用的訊號有:
- -QUIT,表處理完當前請求後,關閉程序。
- -HUP,表示重新載入配置,也就是關閉原有的程序,並開啟新的工作程序。此操作不會中斷使用者的訪問請求,因此可以通過此訊號平滑的重啟Nginx。
- -USR2,用於平滑升級可執行程式。
- -WINCH,從容關閉工作程序。
根據nginx程序控制訊號,執行如下:
kill -USR2 38323(舊程序PID為38323)
ps -ef |grep nginx
切換為新的master程序,關閉舊的work程序,注意此時舊的master程序依然存在,執行如下:
kill –WINCH 38323 (舊程序PID為38323)
ps -ef |grep nginx
檢查此時版本
sbin/nginx -v
已平滑升級成功。
注意:此時新版本nginx的masterPID為41063,同時也存在舊版本的master程序(舊程序PID為38323),若無需再回退時操作,可執行舊程序退出操作,執行如下:
kill –QUIT 38323
回退步驟
關於回退操作分為兩類:
1、事前對舊版本nginx進行備份,若出現問題,直接將舊版本重新拷貝會/usr/local目錄下,重啟nginx舊版本操作,執行如下:
killall nginx
cp nginx-1.12.2.bak nginx-1.12.2
/usr/local/nginx-1.12.2/sbin/nginx –c /usr/local/nginx-1.12.2/nginx.conf
檢查nginx狀態
ps –ef |grep nginx
2、在新版本nginx的master程序和舊版本的master程序同時存在時,執行如下:
切換回舊版本的master程序
kill -HUP 舊masterPID
關閉新版本nginx的master程序,並將原sbin目錄下的nginx.old(舊版本nginx二進位制檔案)重新改回nginx,以便管理nginx。
kill -WINCH 新masterPID
kill -QUIT 新masterPID
cp /usr/local/nginx-1.12.2/sbin/nginx.old /usr/local/nginx-1.12.2/sbin/nginx
再次確認此時nginx版本已退回原版本
sbin/nginx -v