fpm平滑重啟 詳解nginx及FPM平滑重啟

2021-10-17 05:46:33 字數 2811 閱讀 8318

平滑重啟

gr是graceful restart(平滑重啟)的簡稱,是一種在協議重啟時保證**業務不中斷的機制。 gr機制的核心在於:當某裝置進行協議重啟時,能夠通知其周邊裝置在一定時間內將到該裝置的鄰居關係和路由保持穩定。在協議重啟完畢後,周邊裝置協助其進行資訊(包括支援gr的路由/mpls相關協議所維護的各種拓撲、路由和會話資訊)同步,在盡量短的時間內使該裝置恢復到重啟前的狀態。在整個協議重啟過程中不會產生路由振盪,報文**路徑也沒有任何改變,整個系統可以不間斷地**資料。這個過程即稱為平滑重啟。

nginx平滑重啟

nginx程序分為master主程序和worker工作程序,nginx的平滑重啟通過訊號hub控制。

注:在posix相容的平台上,sigusr1和sigusr2是傳送給乙個程序的訊號,它表示了使用者定義的情況。

為了詳細分析nginx的平滑重啟過程,我們持續監控nginx程序變化。 傳送hup訊號

nginx平滑公升級

觀察到nginx程序,fork出新master及worker,此時nginx.pid內容已經發生變化,並且在logs目錄下生成了nginx.pid.oldbin檔案,記錄舊master pid. 2. 向舊master傳送winch訊號,nginx woker會優雅地停止服務,即:停止接收新的請求,但是不會終止已經在處理的請求。一段時間後,舊nginx的所有worker程序全部退出,只剩下master程序,而使用者請求全部都由新的nginx程序處理。

向舊master傳送quit訊號,舊nginx程序完全退出,至此平滑公升級完成。

fpm平滑重啟

fpm(fastcgi 程序管理器)用於替換 php fastcgi 的大部分附加功能,php5.3.3之後已經整合fpm,在./configure的時候帶 –enable-fpm引數即可開啟php-fpm。 fpm的平滑重啟需要通過usr2訊號控制,不過與nginx的平滑重啟過程有較大的不同。

通過持續觀察fpm程序可以看到,fpm平滑重啟,需要等子程序完全退出後,才會啟動新的master及子程序,隨後舊master退出。 使用strace進一步分析

發現master通知所有子程序退出,包含正在處理請求的子程序。 為了進一步驗證這個結論,編寫乙個服務端sleep指令碼

php bug#60961,也有對fpm無法優雅的實現平滑重啟的說明。 難道fpm這麼low?答案當時是no,實際上通過 process_control_timeout 引數可以實現我們的目標。

process_control_timeout 設定子程序接受主程序復用訊號的超時時間。可用單位:s(秒),m(分),h(小時)或者 d(天)。預設單位:s(秒)。預設值:0(關閉)。 原則上,php-fpm會選擇空閒的fastcgi程序去處理請求,在處理之前,php-fpm會給fastcgi傳送訊號,用來讓fastcgi程序準備好接受請求處理。但是fastcgi程序並不總是能夠處理請求,也就是不能總是響應該訊號(比如出現假死的情況),這時候就需要設定php-fpm留給fastcgi程序響應訊號的時間,如果超時了,php-fpm會想其他辦法(例如選擇其他fastcgi程序),這個就是process_control_timeout引數的作用。 這個引數預設是 0,也就是不生效,修改為10,重新驗證,502已經不會再出現。 結論:預設情況下,php-fpm 無法保證平滑的執行 reload 操作,必須設定乙個合理的 process_control_timeout 才行,同時需要注意的是其值不能設定的過大,否則系統可能出現嚴重的請求堵塞問題。

nginx重啟 平滑重啟

進入 ngiinx sbin目錄下 nginx c usr local nginx conf nginx.conf c引數指定了要載入的nginx配置檔案路徑 停止操作 停止操作是通過向nginx程序傳送訊號來進行的 步驟1 查詢nginx主程序號 ps ef grep nginx在程序列表裡 面找...

nginx重啟 平滑重啟

進入 ngiinx sbin目錄下 nginx c usr local nginx conf nginx.conf c引數指定了要載入的nginx配置檔案路徑 停止操作 停止操作是通過向nginx程序傳送訊號來進行的 步驟1 查詢nginx主程序號 ps ef grep nginx 在程序列表裡 面...

fpm平滑重啟 php fpm啟動,重啟,終止操作

啟動php fpm usr local php sbin php fpm php 5.3.3 以後的php fpm 不再支援 php fpm 以前具有的 usr local php sbin php fpm start stop reload 等命令,所以不要再看這種老掉牙的命令了,需要使用訊號控制...