Nginx進程和運行時控制
本節介紹NGINX在運行時啓動的過程以及如何控制它們。
在這個部分中,主要涉及兩個部分的內容:
- 主進程和工作進程
- 控制NGINX
1. 主進程和工作進程
NGINX有一個主進程和一個或多個工作進程。 如果啓用緩存,緩存加載程序和緩存管理器進程也將在啓動時運行。
主程序的主要目的是讀取和評估配置文件以及維護工作進程。
工作進程執行請求的實際處理。 NGINX依賴於操作系統的機制來有效地在工作進程之間分配請求。 工作進程的數量可在nginx.conf
配置文件中定義,可以針對給定的配置進行修復,或者自動調整爲可用CPU內核數(請參閱worker_processes)。
2. 控制NGINX
要重新加載配置文件,可以停止或重新啓動NGINX,或者發送信號到主進程。 可以使用-s
參數運行nginx命令(調用NGINX可執行文件)來發送信號。
nginx -s signal
信號的值可以是以下之一:
-
quit
– 正常地關閉 -
reload
– 重新加載配置文件 -
reopen
– 重新打開日誌文件 -
stop
– 立即關閉(快速關閉)
殺死實用程序也可以使用,將信號直接發送到主進程。 默認情況下,主進程的進程ID被寫入位於/usr/local/nginx/logs
或/var/run
目錄中的nginx.pid
文件。
nginx可以用信號控制。 默認情況下,主進程的進程ID將寫入文件/usr/local/nginx/logs/nginx.pid
。 該名稱可能在配置時更改,或使用pid
指令在nginx.conf
文件中進行更改。主程序支持以下信號:
-
TERM
,INT
- 快速關閉 -
QUIT
- 正常關閉 -
HUP
- 改變配置,跟上改變的時區(僅適用於FreeBSD和Linux),使用新配置啓動新的工作進程,正常關閉舊的工作進程 -
USR1
- 重新打開日誌文件 -
USR2
- 升級可執行文件 -
WINCH
- 正常關閉工作進程
個別工作進程可以用信號來控制,儘管這不是必需的。 支持的信號有:
- TERM, INT - 快速關閉
- QUIT - 正常關閉
- USR1 - 重新打開日誌文件
- WINCH - 調試異常終止(需要啓用
debug_points
)
更改配置
爲了使nginx重新讀取配置文件,應將HUP信號發送到主進程。 主進程首先檢查語法有效性,然後嘗試應用新配置,即打開日誌文件和新的監聽套接字。 如果失敗,它會回滾更改,並繼續使用舊配置。 如果此操作成功,它將啓動新的工作進程,並向舊的工作進程發送消息,請求它們正常關閉。 舊工作進程密切監聽套接字,並繼續爲舊客戶端服務。 在所有客戶端被服務之後,舊的工作進程被關閉。
我們來舉例說明一下。 想象一下,nginx是在FreeBSD 4.x上運行,執行以下命令:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
產生以下輸出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
如果將HUP發送到主進程,則輸出變爲:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
PID 33129
的老工作流程仍然繼續運行。 一段時間後,它退出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
循環日誌文件
要循環日誌文件,需要首先重命名。 之後,USR1信號應發送到主進程。 然後,主進程將重新打開所有當前打開的日誌文件,並將其分配給正在運行的工作進程的非特權用戶作爲所有者。 成功重新打開後,主程序關閉所有打開的文件,並將消息發送到工作進程,要求他們重新打開文件。 工作進程也會打開新文件並立即關閉舊文件。 因此,舊文件幾乎立即可用於後處理,如壓縮。