1. 
          

          1. 新聞動(dòng)態(tài)

            Nginx熱升級流程,看這篇就夠了

            常見(jiàn)問(wèn)題 發(fā)布者:cya 2019-12-21 09:05 訪(fǎng)問(wèn)量:148

            來(lái)自公眾號:武培軒

            在之前做過(guò) Nginx 熱升級的演示,他能保證nginx在不停止服務(wù)的情況下更換他的 binary 文件,這個(gè)功能非常有用,但我們在執行 Nginx 的 binary 文件升級過(guò)程中,還是會(huì )遇到很多問(wèn)題,比如老的 worker 進(jìn)程一直退不掉或者新的 worker 進(jìn)程升級以后出現問(wèn)題需要考慮回滾,或者升級新的 Nginx 文件以后會(huì )發(fā)現預期的功能或者指向的配置文件出現了錯誤,下面我們來(lái)看下看熱升級的流程是怎樣進(jìn)行的?

            熱升級流程

            第一步就是把舊的 Nginx 替換為新的 Nginx 文件(binary文件),之所以說(shuō)只替換 binary 文件是因為大部分場(chǎng)景下,我們新編譯的 nginx 文件所指定的相應的配置選項,比如說(shuō)配置文件的目錄在哪里?log 的所在目錄在哪里?必須保持和老的 Nginx 是一致的,否則的話(huà)沒(méi)有辦法復用 nginx.conf 文件,如果我們僅僅替換 binary 文件,請注意要備份,另外在新版本的 Linux 中,會(huì )要求在覆蓋一個(gè)正在使用的文件時(shí)需要用 cp -f 才能夠替換。

            接下來(lái)我們像現在的老 master 進(jìn)程發(fā)送 USR2 信號,這時(shí)候我們注意到,我們沒(méi)有辦法通過(guò) Nginx 命令行直接用 nginx -s 一個(gè)信號來(lái)處理,因為 Nginx 到目前為止,還沒(méi)有支持這樣的信號。

            發(fā)送 USR2 信號以后,現有的 master 進(jìn)程會(huì )做以下幾件事情:修改 pid 文件名,加后綴 .oldbin,這是為什么呢?這是在為新的 master 進(jìn)程讓路,雖然 master、worker 進(jìn)程都可以接受信號,但是為了管理方便,通常不對 worker 進(jìn)程直接發(fā)送信號,所以我們依賴(lài)于 master 進(jìn)程,他必須把他的 pid 保存下來(lái),為了新的 master 使用 pid.bin 這個(gè)文件名,所以把老的 pid 文件改為 pid.oldbin。

            接下來(lái)使用新的二進(jìn)制文件啟動(dòng)新的 master 進(jìn)程,所以到此為止,會(huì )出現兩個(gè) master 進(jìn)程和老的 worker 進(jìn)程,然后新的 master 進(jìn)程會(huì )自動(dòng)啟動(dòng)新的 worker 進(jìn)程,所以這時(shí)候我們會(huì )發(fā)現兩個(gè) master 進(jìn)程和多個(gè) worker 進(jìn)程的情況。

            接下來(lái)我們要向老的 master 進(jìn)程發(fā)送 QUIT 信號,怎么樣找到老的 master 進(jìn)程呢?我們可以根據 ps 看到 master 進(jìn)程的進(jìn)程號,或者通過(guò) .oldbin 文件找到老的 master 進(jìn)程的進(jìn)程號,向這個(gè)進(jìn)程號發(fā)送 QUIT 信號,那么老的 master 進(jìn)程會(huì )優(yōu)雅的關(guān)閉老 worker 進(jìn)程,這樣我們的熱升級就結束。

            但是老 master 進(jìn)程是一直保存下來(lái)的,這是為了方便我們進(jìn)行回滾,也就是發(fā)現新的 Nginx 程序有問(wèn)題了,這個(gè)時(shí)候因為老的 master 進(jìn)程還在,可以向老的 master 進(jìn)程發(fā)送 HUP 信號,相當于執行了一次 reload,會(huì )啟動(dòng)新的 worker 進(jìn)程,然后再向新 master 進(jìn)程發(fā)送 QUIT 信號,也就是要求新的 worker 進(jìn)程優(yōu)雅退出,就實(shí)現了回滾。

            接下來(lái)看下不停機更新 Nginx 二進(jìn)制文件的具體流程圖:

            不停機更新 Nginx 二進(jìn)制文件

            一開(kāi)始老的 master 進(jìn)程啟動(dòng)了四個(gè)綠色的 worker 進(jìn)程,當我們更新了Nginx 的 binary 以后,向老 master 進(jìn)程發(fā)送了 SIGUSR2 信號,這個(gè)時(shí)候老 master 進(jìn)程會(huì )把自己的 pid 文件改名,這個(gè)時(shí)候可以認為是黃色這種的進(jìn)程。

            那么啟動(dòng)了新的 master 進(jìn)程是怎么樣啟動(dòng)的呢?他啟動(dòng)了新的子進(jìn)程,也就是說(shuō)新的 master 進(jìn)程是老 master 進(jìn)程的子進(jìn)程,但這個(gè)子進(jìn)程是使用了新的 binary 載入來(lái)啟動(dòng)的,在中間這個(gè)流程新老 Nginx 并存,但是老的 master 開(kāi)始關(guān)閉監聽(tīng)端口,所有的黃色老的 worker 進(jìn)程開(kāi)始優(yōu)雅地退出,在完成以后就會(huì )出現只有新的 master 進(jìn)程存在的場(chǎng)景。

            當退出老 master 進(jìn)程以后不能進(jìn)行回滾,如果想回滾,就需要再走一次熱升級流程,用備份好的老 Nginx 文件作為新的熱升級文件(因此建議備份舊的 Nginx 文件)。

            在一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運行時(shí),那么這些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被 init 進(jìn)程(進(jìn)程號為1)所收養,并由 init 進(jìn)程對它們完成狀態(tài)收集工作。所以老 master 進(jìn)程退出后,新的 master 進(jìn)程并不會(huì )退出。

            以上就是熱升級流程,我們可以通過(guò)他實(shí)現不停機更新我們的 Nginx,這為我們持續使用 Nginx 的最新特性提供了幫助。

            總結

            這篇文章主要講解了 Nginx 熱升級的流程,希望在看完本文后可以使你在升級過(guò)程中若發(fā)生錯誤,知道該怎么處理。

            在熱升級之前,建議備份舊的 Nginx 文件,以防升級后出現問(wèn)題,便于回滾。



            關(guān)鍵字: Nginx熱升級流程 開(kāi)封網(wǎng)站建設

            文章連接: http://www.gostscript.com/cjwt/651.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.