nginx怎么實現平滑重啟

一、背景

在服務器開發過程中,難免需要重啟服務加載新的代碼或配置,如果能夠保證server重啟的過程中服務不間斷,那重啟對于業務的影響可以降為0。

二、重啟流程

  • ?重啟意味著新舊接替,在交接任務的過程中勢必會存在新舊server并存的情形,因此,重啟的流程大致為:

    • 啟動新的server

    • 新舊server并存,兩者共同處理請求,提供服務

    • 舊的server處理完所有的請求之后優雅退出

  • 這里,最主要的問題在于如何保證新舊server可以并存,如果重啟前后的server端口一致,如何保證兩者可以監聽同一端口。

?三、nginx實現

為了驗證nginx平滑重啟,筆者首先嘗試nginx啟動的情形下再次開啟一個新的server實例,結果如圖:

nginx怎么實現平滑重啟

很明顯,重新開啟server實例是行不通的,原因在于新舊server使用了同一個端口80,在未開始socket reuseport選項復用端口時,bind系統調用會出錯。nginx默認bind重試5次,失敗后直接退出。而nginx需要監聽ipv4地址0.0.0.0和ipv6地址[::],故圖中打印出10條emerg日志。

接下來就開始嘗試平滑重啟命令了,一共兩條命令:

kill?-usr2?`cat?/var/run/nginx.pid` kill?-quit?`cat?/var/run/nginx.pid.oldbin`

第一條命令是發送信號usr2給舊的master進程,進程的pid存放在/var/run/nginx.pid文件中,其中nginx.pid文件路徑由nginx.conf配置。

第二條命令是發送信號quit給舊的master進程,進程的pid存放在/var/run/nginx.pid.oldbin文件中,隨后舊的master進程退出。

那么問題來了,為什么舊的master進程的pid存在于兩個pid文件之中?事實上,在發送信號usr2給舊的master進程之后,舊的master進程將pid重命名,原先的nginx.pid文件rename成nginx.pid.oldbin。這樣新的master進行就可以使用nginx.pid這個文件名了。

先執行第一條命令,結果如圖:

nginx怎么實現平滑重啟

不錯,新舊master和worker進程并存了。 再來第二條命令,結果如圖:

nginx怎么實現平滑重啟

如你所見,舊的master進程8527和其worker進程全部退出,只剩下新的master進程12740。

不由得產生困惑,為什么手動開啟一個新的實例行不通,使用信號重啟就可以達到。先看下nginx log文件:

nginx怎么實現平滑重啟

除了之前的錯誤日志,還多了一條notice,意思就是繼承了sockets,fd值為6,7。 隨著日志翻看nginx源碼,定位到nginx.c/ngx_exec_new_binary函數之中,

ngx_pid_t ngx_exec_new_binary(ngx_cycle_t?*cycle,?char?*const?*argv) { ??... ??ctx.path?=?argv[0]; ??ctx.name?=?"new?binary?process"; ??ctx.argv?=?argv; ??n?=?2; ??env?=?ngx_set_environment(cycle,?&n); ... ??var?=?ngx_alloc(sizeof(nginx_var) ??????????+?cycle->listening.nelts?*?(ngx_int32_len?+?1)?+?2, ??????????cycle->log); ... ??p?=?ngx_cpymem(var,?nginx_var?"=",?sizeof(nginx_var)); ??ls?=?cycle->listening.elts; ??for?(i?=?0;?i?listening.nelts;?i++)?{ ????p?=?ngx_sprintf(p,?"%ud;",?ls[i].fd); ??} ??*p?=?'

思思久久好好热精品国产|
日产精品久久久久久久|
久久精品免费一区二区三区|
久久香蕉国产线看观看乱码|
久久久久香蕉视频|
久久久久99精品成人片直播|
精品国产乱码久久久久久浪潮|
四虎影视久久久免费|
久久综合国产乱子伦精品免费|
天天久久狠狠色综合|
久久强奷乱码老熟女网站
|
日本久久久久亚洲中字幕|
久久国产精品成人影院|
亚洲精品国产自在久久|
国产精品99精品久久免费|
中文字幕久久亚洲一区|
91精品观看91久久久久久|
亚洲精品乱码久久久久久中文字幕|
色综合久久久久网|
国产精品久久成人影院|
丁香色欲久久久久久综合网|
精品久久人人爽天天玩人人妻|
久久亚洲私人国产精品|
久久久噜噜噜久久中文字幕色伊伊
|
久久精品亚洲日本波多野结衣|
国产精品免费久久|
久久久91精品国产一区二区三区
|
久久久久国产日韩精品网站|
国产精品久久久久9999高清|
久久九九久精品国产免费直播|
免费一级做a爰片久久毛片潮|
亚洲综合久久综合激情久久|
999久久久免费精品国产|
无码伊人66久久大杳蕉网站谷歌|
久久亚洲精品成人无码网站|
亚洲国产视频久久|
欧美精品福利视频一区二区三区久久久精品
|
99久久精品免费看国产一区二区三区|
久久丫精品国产亚洲av|
久久久久人妻一区二区三区vr|
东方aⅴ免费观看久久av|