nginx是一個多進程/多線程高性能web服務器,在linux系統中,nginx啟動后會以后台守護進程(daemon)的方式去運行,后台進程包含一個master進程和多個worker進程(這個數量可以在nginx.conf配置文件中worker_processes這個參數設置),可以充分利用多核架構。nginx工作模式是以多進程的方式來工作的,當然nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式,也是nginx的默認方式。nginx在啟動之后會有一個master進程和多個worker進程(默認是一個),多個worker子進程將監聽同一個端口,並行處理請求。
master主進程主要用來管理worker進程,主要作用是:讀取並驗正配置信息,管理真正提供服務的worker進程,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出后(異常情況下),會自動重新啟動新的worker進程。master進程不會對用戶請求提供服務,而用戶的請求則是worker進程來響應的。
nginx是通過信號來控制,比如關閉,重啟等去控制nginx進程。nginx信號是屬於nginx進程間的通信的一種機制,比如master主進程控制多個worker子進程,也是通過信號控制的,如下圖。

worker 進程數應該設置為等於 CPU 的核數,高流量並發場合也可以考慮將進程數提高至 CPU 核數 * 2。
[root@localhost oa_workflow_test]# ps aux | grep nginx root 2381 0.0 0.0 47688 1464 ? Ss 6月01 0:00 nginx: master process /usr/local/nginx/sbin/nginx www 2383 0.0 0.1 50216 2304 ? S 6月01 0:00 nginx: worker process nginx 2624 0.0 0.3 775948 6800 ? S 6月01 0:00 php-fpm: pool www nginx 2625 0.0 0.3 775948 6800 ? S 6月01 0:00 php-fpm: pool www root 69028 0.0 0.0 114704 976 pts/1 R+ 12:24 0:00 grep --color=auto nginx [root@localhost oa_workflow_test]# /usr/local/nginx/sbin/nginx -s reload [root@localhost oa_workflow_test]# ps aux | grep nginx root 2381 0.0 0.1 48220 2728 ? Ss 6月01 0:04 nginx: master process /usr/local/nginx/sbin/nginx www 2383 0.0 0.1 50216 2304 ? R 6月01 0:02 nginx: worker process is shutting down nginx 2624 0.0 0.3 775948 6800 ? S 6月01 0:00 php-fpm: pool www nginx 2625 0.0 0.3 775948 6800 ? S 6月01 0:00 php-fpm: pool www www 69034 36.0 0.0 0 0 ? R 12:24 0:01 [nginx] www 69035 60.6 0.1 50548 2392 ? R 12:24 0:01 nginx: master process /usr/local/nginx/sbin/nginx www 69036 34.0 0.1 50548 2560 ? S 12:24 0:01 nginx: worker process www 69037 67.6 0.1 50548 2560 ? S 12:24 0:02 nginx: worker process www 69038 36.3 0.1 50548 2260 ? R 12:24 0:01 nginx: master process /usr/local/nginx/sbin/nginx root 69040 49.0 0.0 114708 980 pts/1 S+ 12:24 0:00 grep --color=auto nginx
Nginx支持以下幾種信號選項:
- TERM,INT: 快速關閉
- QUIT :從容關閉(優雅的關閉進程,即等請求結束后再關閉)
- HUP :平滑重啟,重新加載配置文件 (平滑重啟,修改配置文件之后不用重啟服務器。直接kill -PUT 進程號即可)
- USR1 :重新讀取日志文件,在切割日志時用途較大(停止寫入老日志文件,打開新日志文件,之所以這樣是因為老日志文件就算修改的文件名,由於inode的原因,nginx還會一直往老的日志文件寫入數據)
- USR2 :平滑升級可執行程序 ,nginx升級時候用
- WINCH :從容關閉工作進程
Nginx信號控制語法:
kill -信號選項 nginx的主進程號
例如:從容關閉nginx服務
kill -QUIT nginx主進程號
