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

在以前作過 Nginx 熱升級的演示,他能保證nginx在不中止服務的狀況下更換他的 binary 文件,這個功能很是有用,但咱們在執行 Nginx 的 binary 文件升級過程當中,仍是會遇到不少問題,好比老的 worker 進程一直退不掉或者新的 worker 進程升級之後出現問題須要考慮回滾,或者升級新的 Nginx 文件之後會發現預期的功能或者指向的配置文件出現了錯誤,下面咱們來看下看熱升級的流程是怎樣進行的?nginx

熱升級流程

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

第一步就是把舊的 Nginx 替換爲新的 Nginx 文件(binary文件),之因此說只替換 binary 文件是由於大部分場景下,咱們新編譯的 nginx 文件所指定的相應的配置選項,好比說配置文件的目錄在哪裏?log 的所在目錄在哪裏?必須保持和老的 Nginx 是一致的,不然的話沒有辦法複用 nginx.conf 文件,若是咱們僅僅替換 binary 文件,請注意要備份,另外在新版本的 Linux 中,會要求在覆蓋一個正在使用的文件時須要用 cp -f 纔可以替換。web

接下來咱們像如今的老 master 進程發送 USR2 信號,這時候咱們注意到,咱們沒有辦法經過 Nginx 命令行直接用 nginx -s 一個信號來處理,由於 Nginx 到目前爲止,尚未支持這樣的信號。服務器

發送 USR2 信號之後,現有的 master 進程會作如下幾件事情:修改 pid 文件名,加後綴 .oldbin,這是爲何呢?這是在爲新的 master 進程讓路,雖然 master、worker 進程均可以接受信號,可是爲了管理方便,一般不對 worker 進程直接發送信號,因此咱們依賴於 master 進程,他必須把他的 pid 保存下來,爲了新的 master 使用 pid.bin 這個文件名,因此把老的 pid 文件改成 pid.oldbin。ide

接下來使用新的二進制文件啓動新的 master 進程,因此到此爲止,會出現兩個 master 進程和老的 worker 進程,而後新的 master 進程會自動啓動新的 worker 進程,因此這時候咱們會發現兩個 master 進程和多個 worker 進程的狀況。命令行

接下來咱們要向老的 master 進程發送 QUIT 信號,怎麼樣找到老的 master 進程呢?咱們能夠根據 ps 看到 master 進程的進程號,或者經過 .oldbin 文件找到老的 master 進程的進程號,向這個進程號發送 QUIT 信號,那麼老的 master 進程會優雅的關閉老 worker 進程,這樣咱們的熱升級就結束。3d

可是老 master 進程是一直保存下來的,這是爲了方便咱們進行回滾,也就是發現新的 Nginx 程序有問題了,這個時候由於老的 master 進程還在,能夠向老的 master 進程發送 HUP 信號,至關於執行了一次 reload,會啓動新的 worker 進程,而後再向新 master 進程發送 QUIT 信號,也就是要求新的 worker 進程優雅退出,就實現了回滾。日誌

接下來看下不停機更新 Nginx 二進制文件的具體流程圖:blog

不停機更新 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 文件,以防升級後出現問題,便於回滾。

●使用 Nginx 搭建靜態資源 web 服務器
●Nginx 熱部署和日誌切割,你學會了嗎?
●Nginx 瞭解一下?
●你真的瞭解 volatile 關鍵字嗎?
●Java中Set集合是如何實現添加元素保證不重複的?
●爲何不建議使用Date,而是使用Java8新的時間和日期API?

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

武培軒有幫助?在看,轉發走一波喜歡做者

相關文章
相關標籤/搜索