本節(jié)介紹NGINX在運(yùn)行時(shí)啟動(dòng)的過程以及如何控制它們。
在這個(gè)部分中,主要涉及兩個(gè)部分的內(nèi)容:
NGINX有一個(gè)主進(jìn)程和一個(gè)或多個(gè)工作進(jìn)程。 如果啟用緩存,緩存加載程序和緩存管理器進(jìn)程也將在啟動(dòng)時(shí)運(yùn)行。
主程序的主要目的是讀取和評(píng)估配置文件以及維護(hù)工作進(jìn)程。
工作進(jìn)程執(zhí)行請(qǐng)求的實(shí)際處理。 NGINX依賴于操作系統(tǒng)的機(jī)制來有效地在工作進(jìn)程之間分配請(qǐng)求。 工作進(jìn)程的數(shù)量可在nginx.conf
配置文件中定義,可以針對(duì)給定的配置進(jìn)行修復(fù),或者自動(dòng)調(diào)整為可用CPU內(nèi)核數(shù)(請(qǐng)參閱worker_processes)。
要重新加載配置文件,可以停止或重新啟動(dòng)NGINX,或者發(fā)送信號(hào)到主進(jìn)程。 可以使用-s
參數(shù)運(yùn)行nginx命令(調(diào)用NGINX可執(zhí)行文件)來發(fā)送信號(hào)。
nginx -s signal
信號(hào)的值可以是以下之一:
quit
– 正常地關(guān)閉reload
– 重新加載配置文件reopen
– 重新打開日志文件stop
– 立即關(guān)閉(快速關(guān)閉)殺死實(shí)用程序也可以使用,將信號(hào)直接發(fā)送到主進(jìn)程。 默認(rèn)情況下,主進(jìn)程的進(jìn)程ID被寫入位于/usr/local/nginx/logs
或/var/run
目錄中的nginx.pid
文件。
nginx可以用信號(hào)控制。 默認(rèn)情況下,主進(jìn)程的進(jìn)程ID將寫入文件/usr/local/nginx/logs/nginx.pid
。 該名稱可能在配置時(shí)更改,或使用pid
指令在nginx.conf
文件中進(jìn)行更改。主程序支持以下信號(hào):
TERM
, INT
- 快速關(guān)閉QUIT
- 正常關(guān)閉HUP
- 改變配置,跟上改變的時(shí)區(qū)(僅適用于FreeBSD和Linux),使用新配置啟動(dòng)新的工作進(jìn)程,正常關(guān)閉舊的工作進(jìn)程USR1
- 重新打開日志文件USR2
- 升級(jí)可執(zhí)行文件WINCH
- 正常關(guān)閉工作進(jìn)程個(gè)別工作進(jìn)程可以用信號(hào)來控制,盡管這不是必需的。 支持的信號(hào)有:
debug_points
)更改配置
為了使nginx重新讀取配置文件,應(yīng)將HUP信號(hào)發(fā)送到主進(jìn)程。 主進(jìn)程首先檢查語法有效性,然后嘗試應(yīng)用新配置,即打開日志文件和新的監(jiān)聽套接字。 如果失敗,它會(huì)回滾更改,并繼續(xù)使用舊配置。 如果此操作成功,它將啟動(dòng)新的工作進(jìn)程,并向舊的工作進(jìn)程發(fā)送消息,請(qǐng)求它們正常關(guān)閉。 舊工作進(jìn)程密切監(jiān)聽套接字,并繼續(xù)為舊客戶端服務(wù)。 在所有客戶端被服務(wù)之后,舊的工作進(jìn)程被關(guān)閉。
我們來舉例說明一下。 想象一下,nginx是在FreeBSD 4.x上運(yùn)行,執(zhí)行以下命令:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
產(chǎn)生以下輸出:
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發(fā)送到主進(jìn)程,則輸出變?yōu)椋?/p>
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
的老工作流程仍然繼續(xù)運(yùn)行。 一段時(shí)間后,它退出:
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)
循環(huán)日志文件
要循環(huán)日志文件,需要首先重命名。 之后,USR1信號(hào)應(yīng)發(fā)送到主進(jìn)程。 然后,主進(jìn)程將重新打開所有當(dāng)前打開的日志文件,并將其分配給正在運(yùn)行的工作進(jìn)程的非特權(quán)用戶作為所有者。 成功重新打開后,主程序關(guān)閉所有打開的文件,并將消息發(fā)送到工作進(jìn)程,要求他們重新打開文件。 工作進(jìn)程也會(huì)打開新文件并立即關(guān)閉舊文件。 因此,舊文件幾乎立即可用于后處理,如壓縮。