詳解nginx的master進程和worker進程


當你啟動nginx以后,使用ps命令查看nginx進程, 會發現nginx進程不只有一個,默認情況下, 你會看到至少兩個nginx進程,如下:

[root@server1 ~]# ps -ef |grep nginx |grep -v grep
root      2120     1  0 10:03 ?        00:00:00 nginx: master process nginx
nobody    2173  2120  0 10:30 ?        00:00:00 nginx: worker process
[root@server1 ~]# 

 

編譯安裝nginx后,默認情況下worker進程是以"nobody"用戶的身份運行的,如果我們想要指定worker進程的運行用戶,則可以使用"user"指令,比如,指定worker進程以nginx用戶的身份運行

[root@server1 ~]# useradd -u 900 nginx
[root@server1 ~]# id nginx
uid=900(nginx) gid=1001(nginx) groups=1001(nginx)
[root@server1 ~]# 

 

user  nginx;
worker_processes  1;
[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf
[root@server1 ~]# nginx -s reload
[root@server1 ~]# ps -ef |grep nginx |grep -v grep
root      2120     1  0 10:03 ?        00:00:00 nginx: master process nginx
nginx     2206  2120  0 11:16 ?        00:00:00 nginx: worker process
[root@server1 ~]# 

 

在這里插入圖片描述

當我啟動nginx以后,有兩個nginx進程,一個master進程,一個worker進程,這兩個nginx進程都有各自的作用,見名知意, "worker"進程天生就是來"干活"的,真正負責處理請求的進程就是你看到的"worker"進程,那么"master"進程有什么用呢? “master"進程其實是負責管理"worker"進程的,除了管理” worker"進程,master"進程還負責讀取配置文件、判斷配置文件語法的工作,“master進程"也叫"主進程”,在nginx中,"master"進程只能有一個,而"worker"進程可以有多個,worker"進程的數量可以由管理員自己進行定義,那么怎么定義"worker"進程的數量呢?
沒錯,我們只需要借助一條配置指令即可,
這條配指令就是"worker _processes"指令

默認的nginx.conf配置文件中有這樣一條配置
worker_ processes 1;
上述配置的意思就是啟動nginx后只有1個worker進程,你想要多少個worker進程,將worker_ processe指令的值設置成多少就好了,非常簡單, worker_ processes指令只能在main區域中使用,通常情況下,
worker_ processes的值通常不會大於服務器中cpu的核心數量,
換句話說就是,worker進程的數通常與服務器有多少
cpu核心有關,比如,nginx所在主機擁有4核cpu,那么worker_ processes的值通常不會大於4,這樣做的原因是為了盡力讓每個worker進程都有一個cpu可以使用,盡量避免了多個worker進程搶占同一個cpu的情況,我們也可以將worker_ processes的值設置為"auto"
當worker_ processes的值為auto時,nginx會自動檢測當前主機的cpu核心數,並啟動對應數量的worker進程,比如,nginx檢測到當前主機一共有4個cpu核心,那么nginx就會啟動4個worker進程

user  nginx;
worker_processes  auto;

 

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf
[root@server1 ~]# nginx -s reload
nginx: [alert] kill(2120, 1) failed (3: No such process)
[root@server1 ~]# nginx 
[root@server1 ~]# nginx -s reload
[root@server1 ~]# ps -ef | grep nginx |grep -v grep
root      2134     1  0 11:46 ?        00:00:00 nginx: master process nginx
nginx     2140  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx     2141  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx     2142  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx     2143  2134  0 11:46 ?        00:00:00 nginx: worker process
[root@server1 ~]# 

 

在這里插入圖片描述
同時,為了避免cpu在切換進程時產生性能損耗,我們也可以將worker進程與cpu核心進行"綁定",當worker進程與cpu核心綁定以后,worker進程可以更好的專注的使用某個cpu核心上的緩存,從而減少因為cpu切換不同worker進程而帶來的緩存失效,如果想要讓worker進程與某個cpu核心綁定,則需要借助另外一個配置指令,它就是"worker_ cpu_ affinity"指令

想要搞明白怎樣使用"worker_ cpu_ affinity" 指令,最好先來了解一個概念,這個概念就是"cpu掩碼",我們可以通過"cpu掩碼"表示某個cpu核心,比如,當前機器上一共有4個cpu核心,那么我們就用4個0表示這4個核,也就是說,我們可以使用如下字符表示這4個核: 0000
那么第一個核就用如下字符表示
0001
第二個核就用如下字符表示
0010
第三個核就用如下字符表示
0100

規律就是,有幾個核,就用幾個0表示,如果想要使用某個核,就將對應位的0改成1,位從右邊開始
比如,如果有8個核,我就可以使用如下字符表示這8個核中的第二個核:
00000010

user  nginx;
worker_processes  auto;
worker_cpu_affinity 1000 0100 0010 0001;
  • 1
  • 2
  • 3

在這里插入圖片描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM