平日里總是說nginx平滑重啟,workerman平滑重啟。
那么,什么是平滑重啟?
百度百科是這么解釋的:
拿workerman來說:
平滑重啟不同於普通的重啟,平滑重啟可以做到在不影響用戶的情況下重啟服務,以便重新載入PHP程序,完成業務代碼更新。
平滑重啟一般應用於業務更新或者版本發布過程中,能夠避免因為代碼發布重啟服務導致的暫時性服務不可用的影響。
注意:對workerman而言,只有在on{...}回調中載入的文件平滑重啟后才會自動更新,啟動腳本中直接載入的文件或者寫死的代碼運行reload不會自動更新。
平滑重啟原理
1>> 這里先說workerman
WorkerMan分為主進程和子進程,主進程負責監控子進程,子進程負責接收客戶端的連接和連接上發來的請求數據,
做相應的處理並返回數據給客戶端。當業務代碼更新時,其實我們只要更新子進程,便可以達到更新代碼的目的。
當WorkerMan主進程收到平滑重啟信號時,主進程會向其中一個子進程發送安全退出(讓對應進程處理完畢當前請求后才退出)信號,
當這個進程退出后,主進程會重新創建一個新的子進程(這個子進程載入了新的PHP代碼),然后主進程再次向另外一個舊的進程發送停止
命令,這樣一個進程一個進程的重啟,直到所有舊的進程全部被置換為止。
我們看到平滑重啟實際上是讓舊的業務進程逐個退出然后並逐個創建新的進程做到的。為了在平滑重啟時不影響客用戶,這就要求進程中不
要保存用戶相關的狀態信息,即業務進程最好是無狀態的,避免由於進程退出導致信息丟失。
2>> 說下nginx的平滑重啟過程
Nginx的進程分為master主進程和work工作進程,master進程主要管理事件信號接受和分發,所有的請求處理都由work進程處理並返回結 果,Nginx的平滑重啟或重載配置文件等升級,首先是向master發送重啟或重載配置文件信號,然后master告訴所有的work進程不再接受新的 請求,然后master另起新的work進程,最后告訴舊的work進程可以光榮退出了。
nginx平滑升級
nginx平滑upgrade和普通reload的過程有區別,不能一概而論
在upgrade過程中,還涉及到3個信號(USR2、WINCH和QUIT)。
首先發送USR2信號給原master,原master進程會額外啟動一個master進程和若干worker進程,新舊worker進程同時提供對外服務。
第二步發送WINCH信號,原worker進程停止服務並退出。
最后發送QUIT信號給原master使之退出,只保留新的master和worker。
這在Nginx的文檔中有詳細說明 http://wiki.nginx.org/CommandLine#Upgrading_To_a_New_Binary_On_The_Fly
Send HUP signal to the old master process - it will start the worker processes without reloading a configuration file
Send QUIT signal to the new master process to gracefully shut down its worker processes
Send TERM signal to the new master process to force it quit
If for some reason new worker processes do not quit, send KILL signal to them