Nginx 是一個多進程的程序,多進程之間進行通信能夠使用共享內存、信號等。當作進程間管理的時候,一般只使用信號。nginx
今天就來看一下 Nginx 進程管理中的信號是怎樣使用的。segmentfault
從上圖能夠看出,可以發送和處理信號的有 master 進程、worker 進程、Nginx 命令行。網絡
首先讓咱們來看下 Master 進程。工具
由於 master 進程會啓動 worker 進程,因此它管理 worker 進程的方式首先是監控 worker 進程有沒有發送 CHLD 信號,由於 Linux 操做系統中規定當子進程終止的時候會向父進程發送 CHLD 信號,因此若是 worker 進程因爲一些模塊代碼 bug 致使 worker 進程意外終止,那麼 master 進程能夠馬上經過 CHLD 發現這樣一個事件,而後從新把 worker 進程拉起。ui
Master 進程還會經過接受一些信號,來管理 worker 進程。spa
Master 進程能夠接受的信號有:操作系統
其中,粉色的信號 USR2 和 WINCH 只能經過 Linux 的 kill 命令行發送信號,也就是說咱們須要先找到 master 進程所在的 PID,對這個 PID 發送 USR2 或者 WINCH,而其餘的 4 個有對應的 Nginx 命令的。命令行
一般是不直接對 worker 進程發送信號的,由於咱們但願由 master 進程來管理 worker 進程。雖然直接對 worker 進程發送信號,也會讓 worker 進程產生一樣的結果,可是一般不這樣作,每每是由 master 進程管理,master 進程收到信號後,會再把信號發送給 worker 進程。日誌
Nginx 在啓動之後,Nginx會把他的 PID 放到一個文件中。默認是記錄在 Nginx安裝目錄的 /logs/nginx.pid 文件中,記錄了 Nginx 的 master 進程的 PID。blog
當咱們再次使用 nginx -s 這樣的命令行的時候,那麼 nginx 的工具命令行就會去讀取PID文件中的 master 進程的 PID,向這個 PID 發送一樣的 HUP、USR一、TERM、QUIT 這樣的信號,而這樣的命令對應着命令 reload、reopen、stop、quit,因此調用 nginx 命令行和直接用 kill 發送信號的效果是同樣的。
這篇文章主要介紹了 Nginx 進程管理中信號的使用,主要涉及到 Master 進程、Worker 進程和 Nginx 命令行。咱們可能會看到網絡上有不少管理日誌文件或者管理熱升級的腳本,這些腳本中有時候是用 kill 直接發送信號,有時候是調用 nginx -s 這樣一個命令行,不少人以前可能還會很困惑,那麼我相信你們如今應該很瞭解這樣一個過程怎樣發生的了。