能夠經過信號控制 nginx,主進程 pid 默認寫入 /usr/local/nginx/logs/nginx.pid 文件。名稱可能在配置時候,或是經過 nginx.conf 中 pid 指令修改。主進程支持如下信號指令:nginx
儘管不是必須的,獨立的工做進程也能夠經過信號來控制。支持的信號指令以下:shell
爲了讓 nginx 重讀配置文件,須要向主進程發送 HUP 信號,主進程首先檢查配置文件語法有效性,而後嘗試應用新配置,即打開日誌文件和新的監聽端口。若是失敗,回滾修改繼續使用舊的配置,若是成功,建立新的工做進程,發送信號到舊的工做進程,從容關閉它們,舊的進程關閉監聽端口,繼續服務舊客戶端,服務完成,關閉舊的工做進程。服務器
經過例子描繪如下這個過程。假設 nginx 運行在 FreeBSD,執行下面命令:併發
ps -axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
輸出以下所示:debug
發送 HUP 信號到主進程,輸出結果爲:調試
PID 爲 33129 的原工做進程仍然繼續工做,一段時間後再退出:日誌
爲了輪轉日誌文件,首先須要重命名文件,而後給主進程發送 USR1 信號,以後主進程將重啓全部正打開的日誌文件,給這些文件分配無權限的用戶做爲全部者,工做進程運行在這些用戶下。在重啓成功後,主進程關閉全部打開的日誌文件,併發送消息給工做進程重啓文件,工做進程當即打開新的日誌文件,關閉舊的文件。所以,舊文件幾乎立刻進行後續處理,例如壓縮處理。code
爲了更新服務器可執行文件,須要把新文件放在舊文件位置,發送 USR2 信號到主進程,主進程先依據 進程ID 重命名原文件,加上後綴爲 .oldbin,例如 /usr/local/nginx/logs/nginx.pid.oldbin,而後啓動新文件,依次啓動新的工做進程。htm
以後,全部工做進程(新的和舊的)繼續接收請求,若是發送 WINCH 信號給第一個主進程,它會發送消息給對應工做進程,讓它們從容關閉,而後工做進程開始退出:
一段時間以後,只留新工做進程繼續處理請求:
以上會發現舊的主進程並無關閉其監聽端口,若是須要,仍然能夠再次啓動其工做進程。如果由於某些緣由新的可執行文件執行失敗,如下內容其中一條會被執行:
若是新主進程退出,原主進程依據 進程ID 刪除後綴 .oldbin。
若是成功更新,而後發送 QUIT 信號給原主進程,只留新進程: