新聞動(dòng)態(tài)
Nginx熱升級(jí)流程,看這篇就夠了
常見問題 發(fā)布者:cya 2019-12-21 09:05 訪問量:212
來(lái)自公眾號(hào):武培軒
在之前做過(guò) Nginx 熱升級(jí)的演示,他能保證nginx在不停止服務(wù)的情況下更換他的 binary 文件,這個(gè)功能非常有用,但我們?cè)趫?zhí)行 Nginx 的 binary 文件升級(jí)過(guò)程中,還是會(huì)遇到很多問題,比如老的 worker 進(jìn)程一直退不掉或者新的 worker 進(jìn)程升級(jí)以后出現(xiàn)問題需要考慮回滾,或者升級(jí)新的 Nginx 文件以后會(huì)發(fā)現(xiàn)預(yù)期的功能或者指向的配置文件出現(xiàn)了錯(cuò)誤,下面我們來(lái)看下看熱升級(jí)的流程是怎樣進(jìn)行的?
第一步就是把舊的 Nginx 替換為新的 Nginx 文件(binary文件),之所以說(shuō)只替換 binary 文件是因?yàn)榇蟛糠謭?chǎng)景下,我們新編譯的 nginx 文件所指定的相應(yīng)的配置選項(xiàng),比如說(shuō)配置文件的目錄在哪里?log 的所在目錄在哪里?必須保持和老的 Nginx 是一致的,否則的話沒有辦法復(fù)用 nginx.conf 文件,如果我們僅僅替換 binary 文件,請(qǐng)注意要備份,另外在新版本的 Linux 中,會(huì)要求在覆蓋一個(gè)正在使用的文件時(shí)需要用 cp -f
才能夠替換。
接下來(lái)我們像現(xiàn)在的老 master 進(jìn)程發(fā)送 USR2 信號(hào),這時(shí)候我們注意到,我們沒有辦法通過(guò) Nginx 命令行直接用 nginx -s
一個(gè)信號(hào)來(lái)處理,因?yàn)?Nginx 到目前為止,還沒有支持這樣的信號(hào)。
發(fā)送 USR2 信號(hào)以后,現(xiàn)有的 master 進(jìn)程會(huì)做以下幾件事情:修改 pid 文件名,加后綴 .oldbin,這是為什么呢?這是在為新的 master 進(jìn)程讓路,雖然 master、worker 進(jìn)程都可以接受信號(hào),但是為了管理方便,通常不對(duì) worker 進(jìn)程直接發(fā)送信號(hào),所以我們依賴于 master 進(jìn)程,他必須把他的 pid 保存下來(lái),為了新的 master 使用 pid.bin 這個(gè)文件名,所以把老的 pid 文件改為 pid.oldbin。
接下來(lái)使用新的二進(jìn)制文件啟動(dòng)新的 master 進(jìn)程,所以到此為止,會(huì)出現(xiàn)兩個(gè) master 進(jìn)程和老的 worker 進(jìn)程,然后新的 master 進(jìn)程會(huì)自動(dòng)啟動(dòng)新的 worker 進(jìn)程,所以這時(shí)候我們會(huì)發(fā)現(xiàn)兩個(gè) master 進(jìn)程和多個(gè) worker 進(jìn)程的情況。
接下來(lái)我們要向老的 master 進(jìn)程發(fā)送 QUIT 信號(hào),怎么樣找到老的 master 進(jìn)程呢?我們可以根據(jù) ps
看到 master 進(jìn)程的進(jìn)程號(hào),或者通過(guò) .oldbin 文件找到老的 master 進(jìn)程的進(jìn)程號(hào),向這個(gè)進(jìn)程號(hào)發(fā)送 QUIT 信號(hào),那么老的 master 進(jìn)程會(huì)優(yōu)雅的關(guān)閉老 worker 進(jìn)程,這樣我們的熱升級(jí)就結(jié)束。
但是老 master 進(jìn)程是一直保存下來(lái)的,這是為了方便我們進(jìn)行回滾,也就是發(fā)現(xiàn)新的 Nginx 程序有問題了,這個(gè)時(shí)候因?yàn)槔系?master 進(jìn)程還在,可以向老的 master 進(jìn)程發(fā)送 HUP 信號(hào),相當(dāng)于執(zhí)行了一次 reload,會(huì)啟動(dòng)新的 worker 進(jìn)程,然后再向新 master 進(jìn)程發(fā)送 QUIT 信號(hào),也就是要求新的 worker 進(jìn)程優(yōu)雅退出,就實(shí)現(xiàn)了回滾。
接下來(lái)看下不停機(jī)更新 Nginx 二進(jìn)制文件的具體流程圖:
一開始老的 master 進(jìn)程啟動(dòng)了四個(gè)綠色的 worker 進(jìn)程,當(dāng)我們更新了Nginx 的 binary 以后,向老 master 進(jìn)程發(fā)送了 SIGUSR2 信號(hào),這個(gè)時(shí)候老 master 進(jìn)程會(huì)把自己的 pid 文件改名,這個(gè)時(shí)候可以認(rèn)為是黃色這種的進(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 開始關(guān)閉監(jiān)聽端口,所有的黃色老的 worker 進(jìn)程開始優(yōu)雅地退出,在完成以后就會(huì)出現(xiàn)只有新的 master 進(jìn)程存在的場(chǎng)景。
當(dāng)退出老 master 進(jìn)程以后不能進(jìn)行回滾,如果想回滾,就需要再走一次熱升級(jí)流程,用備份好的老 Nginx 文件作為新的熱升級(jí)文件(因此建議備份舊的 Nginx 文件)。
在一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行時(shí),那么這些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被 init 進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由 init 進(jìn)程對(duì)它們完成狀態(tài)收集工作。所以老 master 進(jìn)程退出后,新的 master 進(jìn)程并不會(huì)退出。
以上就是熱升級(jí)流程,我們可以通過(guò)他實(shí)現(xiàn)不停機(jī)更新我們的 Nginx,這為我們持續(xù)使用 Nginx 的最新特性提供了幫助。
這篇文章主要講解了 Nginx 熱升級(jí)的流程,希望在看完本文后可以使你在升級(jí)過(guò)程中若發(fā)生錯(cuò)誤,知道該怎么處理。
在熱升級(jí)之前,建議備份舊的 Nginx 文件,以防升級(jí)后出現(xiàn)問題,便于回滾。
關(guān)鍵字: Nginx熱升級(jí)流程 開封網(wǎng)站建設(shè)
文章連接: http://www.hsjyfc.com.cn/cjwt/651.html
版權(quán)聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請(qǐng)聯(lián)系我們,我們會(huì)立即刪除。如轉(zhuǎn)載請(qǐng)保留
晨展解決方案
晨展新聞