Nginx生產(chǎn)環(huán)境平滑升級的實現(xiàn)
一.背景
最近遇到一個比較尷尬而又實際的問題,那就是我們生產(chǎn)環(huán)境使用的Nginx是Centos6的老古董。業(yè)務(wù)需求需要加載Nginx的一個模塊來實現(xiàn),但是版本太老了,需要Nginx1.18之后才能支持,而我們的是Nginx1.12。 那升級Nginx是我們要做的事情。但是在生產(chǎn)環(huán)境你要考慮的東西很多,不像測試服,Nginx停掉服務(wù),重新編譯新的版本再啟動。 我們線上的服務(wù)需要不間斷地提供服務(wù),否則會對業(yè)務(wù)產(chǎn)生經(jīng)濟損失. 那有什么方案能平滑升級Nginx版本呢?
二.升級方案
其實官方早就針對Nginx平滑升級做足了功夫,基本原理就是,啟動新的Nginx(master+worker)進程,之后給舊的master進程發(fā)送-USER2指令,這樣就能同時讓新版和舊版本進程同時接收處理請求。之后我們再發(fā)送-WINCH給舊進程,讓它停止工作服務(wù)(關(guān)閉所有舊worker進程,但是舊的master進程沒關(guān),防止后面你遇到問題回滾). 如果確認(rèn)新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的編譯參數(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報錯,可以嘗試安裝: yum install -y gcc-c++
3.備份舊版本二進制nginx程序, mv nginx nginx.old
mv nginx nginx.old
4.此時我們下載【nginx1.20.2】新版本重新編譯,按照舊版本的編譯參數(shù)(或者自己新增編譯模塊)
5.拷貝新生成的二進制nginx, 移動到之前舊版本的nginx路徑覆蓋.
./configure --prefix=/usr/local/ --with-stream ?xxxx[模塊列表] make &make install
6.發(fā)送nginx -USR2 15180(舊版nginx主進程)進行替換,此時存在4個進程. 2個舊版nginx進程 2個新版nginx進程

此時請求經(jīng)過測試是負(fù)載均衡到這2個master上.

請求2次,第一次負(fù)載到新的master,第二次負(fù)載到舊的master.
7.確認(rèn)升級成功,-WINCH 信號 停止舊版master接收新的請求(此時舊版本nginx master進程沒死,只是停止接收新的請求)
kill -winch 15180

舊版nginx只剩下master進程, 子進程不存在了.
此時多次訪問URL, 不會出現(xiàn)負(fù)載均衡的情況了.

沒有再出現(xiàn)hello world
8.若要回退版本也很簡單,發(fā)送 kill -HUP 15180(舊nginx master進程)即可


此時舊版和新版nginx都在負(fù)載均衡. 把新版本nginx master kill掉即可.
此時新版nginx已經(jīng)kill -QUIT 即可.
到此這篇關(guān)于Nginx生產(chǎn)環(huán)境平滑升級的實現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx生產(chǎn)環(huán)境平滑升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Prometheus 抓取 nginx 訪問日志的指標(biāo)
通過結(jié)合NGINX Exporter, Fluentd, Prometheus和Grafana, 可有效監(jiān)控并可視化NGINX中的4xx和5xx狀態(tài)碼日志,首先使用Fluentd收集和解析NGINX日志,再通過Prometheus抓取Fluentd暴露的指標(biāo),本文介紹Prometheus抓取nginx訪問日志的指標(biāo),感興趣的朋友一起看看吧2024-10-10
Nginx服務(wù)器中的模塊編寫及相關(guān)內(nèi)核源碼初探
這篇文章主要介紹了Nginx服務(wù)器中的模塊編寫及相關(guān)源碼初探,文中以一個簡單的Hello world模塊的編寫來深入分析Nginx內(nèi)核所用到的基礎(chǔ)函數(shù),需要的朋友可以參考下2015-12-12
Nginx?error_page自定義錯誤頁面設(shè)置過程
這篇文章主要介紹了Nginx?error_page自定義錯誤頁面設(shè)置過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
生產(chǎn)環(huán)境之Nginx高可用方案實現(xiàn)過程解析
這篇文章主要介紹了生產(chǎn)環(huán)境之Nginx高可用方案實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
NGINX基于cookie針對同一域名進行分流轉(zhuǎn)發(fā)
本文介紹了利用NGINX基于cookie進行多環(huán)境分流的方法,通過在Docker中部署兩個后端NGINX容器,并在前端NGINX配置中設(shè)置map規(guī)則,根據(jù)cookie值將請求分發(fā)到不同后端,感興趣的可以了解一下2025-07-07
詳解Nginx反向代理實現(xiàn)Kibana登錄認(rèn)證功能
這篇文章主要介紹了詳解Nginx反向代理實現(xiàn)Kibana登錄認(rèn)證功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
Nginx geoip模塊實現(xiàn)地區(qū)性負(fù)載均衡
相信做過awstats的都用過開源的geoip.dat ip數(shù)據(jù)庫,剛好nginx wiki上有g(shù)eoip 模塊,這樣就可以實現(xiàn)地區(qū)性的負(fù)載均衡,但是maxmind 的ip數(shù)據(jù)庫對中國的支持不算太好,不過現(xiàn)在也不錯了~2010-12-12

