Nginx生產環境平滑升級的方法是什么

一.背景

最近遇到一個比較尷尬而又實際的問題,那就是我們生產環境使用的nginx是centos6的老古董。業務需求需要加載nginx的一個模塊來實現,但是版本太老了,需要nginx1.18之后才能支持,而我們的是nginx1.12。 那升級nginx是我們要做的事情。但是在生產環境你要考慮的東西很多,不像測試服,nginx停掉服務,重新編譯新的版本再啟動。 我們線上的服務需要不間斷地提供服務,否則會對業務產生經濟損失. 那有什么方案能平滑升級nginx版本呢?

二.升級方案

其實官方早就針對Nginx平滑升級做足了功夫,基本原理就是,啟動新的Nginx(master+worker)進程,之后給舊的master進程發送-USER2指令,這樣就能同時讓新版和舊版本進程同時接收處理請求。之后我們再發送-WINCH給舊進程,讓它停止工作服務(關閉所有舊worker進程,但是舊的master進程沒關,防止后面你遇到問題回滾). 如果確認新Nginx沒問題,那么再手動Kill舊的master進程即可完成平滑升級.

三.操作流程

1.查看-舊版本【nginx 1.12.2】進程信息

[root@k8s-master?nginx-1.12.2]#?ps?aux?|?grep?'nginx'?|?grep?-v?'7月'?|?grep?-v?'grep'  root?????15180??0.0??0.0??46136???920??????????Ss???17:22???0:00?nginx:?master?process?./nginx-1.12.2/sbin/nginx  nobody???15181??0.0??0.1??46584??4344??????????S????17:22???0:00?nginx:?worker?process

主要進程pid: ?15180 ?worker進程15181

2. nginx -V查看舊版本nginx的編譯參數

[root@k8s-master?nginx-1.12.2]#?nginx-1.12.2/sbin/nginx.old.1.12?-V  nginx?version:?nginx/1.12.2  built?by?gcc?4.8.5?20150623?(Red?Hat?4.8.5-44)?(GCC)  built?with?OpenSSL?1.0.2k-fips??26?Jan?2017  TLS?SNI?support?enabled  configure?arguments:?--prefix=nginx-1.12.2?--with-pcre=/root/nginx-test/pcre-8.45/?--with-http_stub_status_module?--with-http_gzip_static_module?--with-http_ssl_module?--with-stream  [root@k8s-master?nginx-1.12.2]#

如果make或者./configure報錯,可以嘗試安裝: ?yum install -y gcc-c++

3.備份舊版本二進制nginx程序, ?mv nginx nginx.old

mv?nginx?nginx.old

4.此時我們下載【nginx1.20.2】新版本重新編譯,按照舊版本的編譯參數(或者自己新增編譯模塊)

5.拷貝新生成的二進制nginx, 移動到之前舊版本的nginx路徑覆蓋.

./configure?--prefix=/usr/local/?--with-stream??xxxx[模塊列表]  make  &make?install

6.發送nginx -USR2 15180(舊版nginx主進程)進行替換,此時存在4個進程. ?2個舊版nginx進程??2個新版nginx進程

Nginx生產環境平滑升級的方法是什么

此時請求經過測試是負載均衡到這2個master上.

Nginx生產環境平滑升級的方法是什么

請求2次,第一次負載到新的master,第二次負載到舊的master.

7.確認升級成功,-WINCH 信號?停止舊版master接收新的請求(此時舊版本nginx master進程沒死,只是停止接收新的請求)

kill?-winch?15180

Nginx生產環境平滑升級的方法是什么

舊版nginx只剩下master進程, 子進程不存在了.

此時多次訪問URL, 不會出現負載均衡的情況了.

Nginx生產環境平滑升級的方法是什么

沒有再出現hello world

8.若要回退版本也很簡單,發送?kill -HUP 15180(舊nginx master進程)即可

Nginx生產環境平滑升級的方法是什么

Nginx生產環境平滑升級的方法是什么

此時舊版和新版nginx都在負載均衡. ?把新版本nginx master kill掉即可.

此時新版nginx已經kill -QUIT 即可.

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享