1. 程式人生 > >Nginx熱升級流程,看這篇就夠了

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

在之前做過 Nginx 熱升級的演示,他能保證nginx在不停止服務的情況下更換他的 binary 檔案,這個功能非常有用,但我們在執行 Nginx 的 binary 檔案升級過程中,還是會遇到很多問題,比如老的 worker 程序一直退不掉或者新的 worker 程序升級以後出現問題需要考慮回滾,或者升級新的 Nginx 檔案以後會發現預期的功能或者指向的配置檔案出現了錯誤,下面我們來看下看熱升級的流程是怎樣進行的?

熱升級流程

第一步就是把舊的 Nginx 替換為新的 Nginx 檔案(binary檔案),之所以說只替換 binary 檔案是因為大部分場景下,我們新編譯的 nginx 檔案所指定的相應的配置選項,比如說配置檔案的目錄在哪裡?log 的所在目錄在哪裡?必須保持和老的 Nginx 是一致的,否則的話沒有辦法複用 nginx.conf 檔案,如果我們僅僅替換 binary 檔案,請注意要備份,另外在新版本的 Linux 中,會要求在覆蓋一個正在使用的檔案時需要用 cp -f

才能夠替換。

接下來我們像現在的老 master 程序傳送 USR2 訊號,這時候我們注意到,我們沒有辦法通過 Nginx 命令列直接用 nginx -s 一個訊號來處理,因為 Nginx 到目前為止,還沒有支援這樣的訊號。

傳送 USR2 訊號以後,現有的 master 程序會做以下幾件事情:修改 pid 檔名,加字尾 .oldbin,這是為什麼呢?這是在為新的 master 程序讓路,雖然 master、worker 程序都可以接受訊號,但是為了管理方便,通常不對 worker 程序直接傳送訊號,所以我們依賴於 master 程序,他必須把他的 pid 儲存下來,為了新的 master 使用 pid.bin 這個檔名,所以把老的 pid 檔案改為 pid.oldbin。

接下來使用新的二進位制檔案啟動新的 master 程序,所以到此為止,會出現兩個 master 程序和老的 worker 程序,然後新的 master 程序會自動啟動新的 worker 程序,所以這時候我們會發現兩個 master 程序和多個 worker 程序的情況。

接下來我們要向老的 master 程序傳送 QUIT 訊號,怎麼樣找到老的 master 程序呢?我們可以根據 ps 看到 master 程序的程序號,或者通過 .oldbin 檔案找到老的 master 程序的程序號,向這個程序號傳送 QUIT 訊號,那麼老的 master 程序會優雅的關閉老 worker 程序,這樣我們的熱升級就結束。

但是老 master 程序是一直儲存下來的,這是為了方便我們進行回滾,也就是發現新的 Nginx 程式有問題了,這個時候因為老的 master 程序還在,可以向老的 master 程序傳送 HUP 訊號,相當於執行了一次 reload,會啟動新的 worker 程序,然後再向新 master 程序傳送 QUIT 訊號,也就是要求新的 worker 程序優雅退出,就實現了回滾。

接下來看下不停機更新 Nginx 二進位制檔案的具體流程圖:

不停機更新 Nginx 二進位制檔案

一開始老的 master 程序啟動了四個綠色的 worker 程序,當我們更新了Nginx 的 binary 以後,向老 master 程序傳送了 SIGUSR2 訊號,這個時候老 master 程序會把自己的 pid 檔案改名,這個時候可以認為是黃色這種的程序。

那麼啟動了新的 master 程序是怎麼樣啟動的呢?他啟動了新的子程序,也就是說新的 master 程序是老 master 程序的子程序,但這個子程序是使用了新的 binary 載入來啟動的,在中間這個流程新老 Nginx 並存,但是老的 master 開始關閉監聽埠,所有的黃色老的 worker 程序開始優雅地退出,在完成以後就會出現只有新的 master 程序存在的場景。

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

在一個父程序退出,而它的一個或多個子程序還在執行時,那麼這些子程序將成為孤兒程序。孤兒程序將被 init 程序(程序號為1)所收養,並由 init 程序對它們完成狀態收集工作。所以老 master 程序退出後,新的 master 程序並不會退出。

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

總結

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

在熱升級之前,建議備份舊的 Nginx 檔案,以防升級後出現問題,便於回滾