最近遇到一個比較尷尬又實際的問題,那就是我們生產環境使用的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進程
此時請求經過測試是負載平衡到這2個master上.
請求2次,第一次負載到新的master,第二次負載到舊的master .
7.確認升級成功,-WINCH 訊號 停止舊版master接收新的請求(此時舊版nginx master進程沒死,只是停止接收新的請求)
kill -winch 15180
舊版nginx只剩下master進程, 子進程不存在了.
此時多次存取URL, 不會出現負載平衡的情況了.
沒有再出現hello world
8.若要回退版本也很簡單,發送 kill -HUP 15180(舊nginx master進程)即可
此時舊版和新版nginx都在負載平衡. 把新版本nginx master kill掉即可.
此時新版nginx已經kill -QUIT 即可.
以上是Nginx生產環境平滑升級的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!