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信號應傳送到主進程。 然後,主進程將重新開啟所有當前開啟的紀錄檔檔案,並將其分配給正在執行的工作進程的非特權使用者作為所有者。 成功重新開啟後,主程式關閉所有開啟的檔案,並將訊息傳送到工作進程,要求他們重新開啟檔案。 工作進程也會開啟新檔案並立即關閉舊檔案。 因此,舊檔案幾乎立即可用於後處理,如壓縮。