Nginx API 學習之二:控制nginx

控制nginx

Controlling nginxhtml

能夠經過信號控制 nginx,主進程 pid 默認寫入 /usr/local/nginx/logs/nginx.pid 文件。名稱可能在配置時候,或是經過 nginx.confpid 指令修改。主進程支持如下信號指令:nginx

  • TERM, INT 快速關閉
  • QUIT 從容關閉
  • HUP 修改配置文件,跟上時區的變化(僅適用於FreeBSD和Linux系統),針對修改後的配置文件建立一個新的工做進程,從容關閉原工做進程
  • USR1 從新打開日誌文件
  • USR2 更新可執行文件
  • WINCH 從容關閉工做進程

儘管不是必須的,獨立的工做進程也能夠經過信號來控制。支持的信號指令以下:shell

  • TERM, INT 快速關閉
  • QUIT 從容關閉
  • USR1 從新打開日誌文件
  • WINCH 調試時非正常停止(須要啓用debug_points

修改配置文件

爲了讓 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 信號給第一個主進程,它會發送消息給對應工做進程,讓它們從容關閉,而後工做進程開始退出:

一段時間以後,只留新工做進程繼續處理請求:

以上會發現舊的主進程並無關閉其監聽端口,若是須要,仍然能夠再次啓動其工做進程。如果由於某些緣由新的可執行文件執行失敗,如下內容其中一條會被執行:

  • 發送 HUP 信號到原主進程,主進程將在不重讀配置文件的狀況下啓動新的工做進程,而後發送 QUIT 信號給新的主進程來從容關閉全部新進程。
  • 發送 TERM 信號給新主進程,主進程發送消息給其工做進程讓它們當即退出,工做進程幾乎即刻退出(如果由於某些緣由新進程未退出,應該發送 KILL 信號強制退出),當新主進程退出時,原主進程將自動啓動新工做進程。

若是新主進程退出,原主進程依據 進程ID 刪除後綴 .oldbin

若是成功更新,而後發送 QUIT 信號給原主進程,只留新進程:

相關文章
相關標籤/搜索