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信號應發送到主進程。 然後,主進程將重新打開所有當前打開的日誌文件,並將其分配給正在運行的工作進程的非特權用戶作爲所有者。 成功重新打開後,主程序關閉所有打開的文件,並將消息發送到工作進程,要求他們重新打開文件。 工作進程也會打開新文件並立即關閉舊文件。 因此,舊文件幾乎立即可用於後處理,如壓縮。