當啟動nginx以後,使用
ps
指令檢視nginx程序,會發現nginx程序不隻有一個,預設情況下,會看到至少兩個nginx程序,如下:
[[email protected] conf]# ps -ef | grep nginx | grep -v grep
root 4876 1 0 Feb25 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 31239 4876 0 04:02 ? 00:00:00 nginx: worker process
可以看出編譯安裝nginx後,預設情況下worker程序是以
nobody
使用者的身份運作的,如果我們想要指定worker程序的運作使用者,則可以使用
user
指令,比如,指定worker程序以nginx使用者的身份運作,配置如下:
[[email protected] conf]# vim nginx.conf
2 user nginx;
注意:此配置需要使用
useradd -u 900 nginx
在系統中添加名稱為nginx的使用者。
user配置指令也隻能在main上下文中使用。
當啟動nginx以後,有兩個nginx程序,一個master程序,一個worker程序,這兩個nginx程序都有各自的作用,見名知意,worker程序天生就是來"幹活"的,真正負責處理請求的程序就是你看到的"worker"程序,那麼"master"程序有什麼用呢?"master"程序其實是負責管理"worker"程序的,除了管理"worker"程序, "master"程序還負責讀取配置檔案、判斷配置檔案文法的工作,“master程序"也叫"主程序”, 在nginx中,"master"程序隻能有一個,而"worker"程序可以有多個,"worker"程序的數量可以由管理者自己進行定義,可以使用
worker_processes
配置指令來定義"worker"程序的數量。
預設的
nginx.conf
配置檔案中有這樣一條配置:
上述配置的意思就是啟動nginx後隻有1個worker程序,想要多少個worker程序,将
worker_processe
指令的值設定成多少就好了,worker_processes指令隻能在main區域中使用,通常情況下,worker_processes的值通常不會大于伺服器中cpu的核心數量,換句話說就是,worker程序的數量通常與伺服器有多少cpu核心有關,比如,nginx所在主機擁有4核cpu,那麼worker_processes的值通常不會大于4,這樣做的原因是為了盡量讓每個worker程序都有一個cpu可以使用,盡量避免了多個worker程序搶占同一個cpu的情況,當然,你想要的在4核的機器上将worker_processes的值設定為8,也是完全可行的。除了某個具體的數字,我們也可以将worker_processes的值設定為"auto",如下:
[[email protected] conf]# vim nginx.conf
3 worker_processes auto;
當
worker_processes
的值為auto時,nginx會自動檢測目前主機的cpu核心數量,并啟動對應數量的worker程序,比如,nginx檢測到目前主機一共有4個cpu核心,那麼nginx就會啟動4個worker程序,如果你是通過編譯的方式安裝的nginx,或者通過官方yum源安裝的nginx,那麼
worker_processes
的預設值為1,如果你是通過阿裡的yum源安裝的nginx,那麼預設的
nginx.conf
中,
worker_processes
的值通常是auto。
同時,為了避免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
第四個和就用如下字元表示
1000
規律就是,有幾個核,就用幾個0表示,如果想要使用某個核,就将對應位置的0改成1,位置從右邊開始,比如,如果有8個核,我就可以使用如下字元表示這8個核中的第二個核:
00000010
上述表示法就是所謂的"cpu掩碼",好了,聊完cpu掩碼,再來了解"worker_cpu_affinity"指令就容易多了。
假如目前主機一共有兩個cpu核心,我想要啟動兩個worker程序,并且将這兩個worker程序分别綁定到兩個核心上,那麼我就可以通過如下兩條配置指令完成上述設定:
worker_processes 2;
worker_cpu_affinity 01 10;
上述設定表示啟動2個worker程序,分别綁定到"01"核"與"10"核上。
除了使用cpu掩碼綁定cpu,你也可以将worker_cpu_affinity指令的值設定為"auto",當worker_cpu_affinity的值為auto時,nginx會自動将worker程序平均的綁定到可用的核心上,而不用你進行手動的設定,如果你的worker程序數量大于cpu核心的數量,我覺得将worker_cpu_affinity指令的值設定為auto是非常好的選擇。
worker_cpu_affinity指令與worker_processes指令一樣,隻能在main上下文中使用。