Nginx生產(chǎn)環(huán)境平滑升級(jí)的實(shí)現(xiàn)
一.背景
最近遇到一個(gè)比較尷尬而又實(shí)際的問題,那就是我們生產(chǎn)環(huán)境使用的Nginx是Centos6的老古董。業(yè)務(wù)需求需要加載Nginx的一個(gè)模塊來實(shí)現(xiàn),但是版本太老了,需要Nginx1.18之后才能支持,而我們的是Nginx1.12。 那升級(jí)Nginx是我們要做的事情。但是在生產(chǎn)環(huán)境你要考慮的東西很多,不像測(cè)試服,Nginx停掉服務(wù),重新編譯新的版本再啟動(dòng)。 我們線上的服務(wù)需要不間斷地提供服務(wù),否則會(huì)對(duì)業(yè)務(wù)產(chǎn)生經(jīng)濟(jì)損失. 那有什么方案能平滑升級(jí)Nginx版本呢?
二.升級(jí)方案
其實(shí)官方早就針對(duì)Nginx平滑升級(jí)做足了功夫,基本原理就是,啟動(dòng)新的Nginx(master+worker)進(jìn)程,之后給舊的master進(jìn)程發(fā)送-USER2指令,這樣就能同時(shí)讓新版和舊版本進(jìn)程同時(shí)接收處理請(qǐng)求。之后我們?cè)侔l(fā)送-WINCH給舊進(jìn)程,讓它停止工作服務(wù)(關(guān)閉所有舊worker進(jìn)程,但是舊的master進(jìn)程沒關(guān),防止后面你遇到問題回滾). 如果確認(rèn)新Nginx沒問題,那么再手動(dòng)Kill舊的master進(jìn)程即可完成平滑升級(jí).
三.操作流程
1.查看-舊版本【nginx 1.12.2】進(jìn)程信息
[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
主要進(jìn)程pid: 15180 worker進(jìn)程15181
2. nginx -V查看舊版本nginx的編譯參數(shù)
[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報(bào)錯(cuò),可以嘗試安裝: yum install -y gcc-c++
3.備份舊版本二進(jìn)制nginx程序, mv nginx nginx.old
mv nginx nginx.old
4.此時(shí)我們下載【nginx1.20.2】新版本重新編譯,按照舊版本的編譯參數(shù)(或者自己新增編譯模塊)
5.拷貝新生成的二進(jìn)制nginx, 移動(dòng)到之前舊版本的nginx路徑覆蓋.
./configure --prefix=/usr/local/ --with-stream ?xxxx[模塊列表] make &make install
6.發(fā)送nginx -USR2 15180(舊版nginx主進(jìn)程)進(jìn)行替換,此時(shí)存在4個(gè)進(jìn)程. 2個(gè)舊版nginx進(jìn)程 2個(gè)新版nginx進(jìn)程
此時(shí)請(qǐng)求經(jīng)過測(cè)試是負(fù)載均衡到這2個(gè)master上.
請(qǐng)求2次,第一次負(fù)載到新的master,第二次負(fù)載到舊的master.
7.確認(rèn)升級(jí)成功,-WINCH 信號(hào) 停止舊版master接收新的請(qǐng)求(此時(shí)舊版本nginx master進(jìn)程沒死,只是停止接收新的請(qǐng)求)
kill -winch 15180
舊版nginx只剩下master進(jìn)程, 子進(jìn)程不存在了.
此時(shí)多次訪問URL, 不會(huì)出現(xiàn)負(fù)載均衡的情況了.
沒有再出現(xiàn)hello world
8.若要回退版本也很簡(jiǎn)單,發(fā)送 kill -HUP 15180(舊nginx master進(jìn)程)即可
此時(shí)舊版和新版nginx都在負(fù)載均衡. 把新版本nginx master kill掉即可.
此時(shí)新版nginx已經(jīng)kill -QUIT 即可.
到此這篇關(guān)于Nginx生產(chǎn)環(huán)境平滑升級(jí)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx生產(chǎn)環(huán)境平滑升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
隱藏網(wǎng)站Nginx版本號(hào)信息的方法分享
隱藏網(wǎng)站nginx服務(wù)的版本號(hào)信息,在安全的角度上來說,可以防止黑客快速利用nginx的版本漏洞進(jìn)行攻擊,所以本文為大家整理了隱藏網(wǎng)站Nginx版本號(hào)信息的方法,希望對(duì)大家有所幫助2023-08-08Nginx對(duì)某個(gè)目錄設(shè)置密碼保護(hù)例子
這篇文章主要介紹了Nginx對(duì)某個(gè)目錄設(shè)置密碼保護(hù)例子,使用htpasswd 生成用戶名和密碼,并解決了打開PHP文件變成文件下載的問題,需要的朋友可以參考下2014-06-06Linux系統(tǒng)下nginx日志每天定時(shí)切割的腳本寫法
本篇文章給大家分享使用Linux系統(tǒng)自帶的命令logrotate對(duì)Nginx日志進(jìn)行切割的方法,對(duì)nginx日志切割腳本感興趣的朋友一起學(xué)習(xí)吧2016-11-11詳解Nginx實(shí)戰(zhàn)之讓用戶通過用戶名密碼認(rèn)證訪問web站點(diǎn)
這篇文章主要介紹了詳解Nginx實(shí)戰(zhàn)之讓用戶通過用戶名密碼認(rèn)證訪問web站點(diǎn),有興趣的可以了解一下。2016-11-11nginx實(shí)現(xiàn)根據(jù)URL轉(zhuǎn)發(fā)請(qǐng)求的實(shí)戰(zhàn)經(jīng)歷
這篇文章主要給大家介紹了一次關(guān)于nginx實(shí)現(xiàn)根據(jù)URL轉(zhuǎn)發(fā)請(qǐng)求的實(shí)戰(zhàn)經(jīng)歷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Nginx優(yōu)化服務(wù)之網(wǎng)頁壓縮的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx優(yōu)化服務(wù)之網(wǎng)頁壓縮的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01