

master-workers 的機(jī)制的好處
首先,對于每個 worker 進(jìn)程來說,獨(dú)立的進(jìn)程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。其次,采用獨(dú)立的進(jìn)程,可以讓互相之間不會影響,一個進(jìn)程退出后,其它進(jìn)程還在工作,服務(wù)不會中斷,master 進(jìn)程則很快啟動新的worker 進(jìn)程。當(dāng)然,worker 進(jìn)程的異常退出,肯定是程序有 bug 了,異常退出,會導(dǎo)致當(dāng)前 worker 上的所有請求失敗,不過不會影響到所有請求,所以降低了風(fēng)險。
需要設(shè)置多少個 worker
Nginx 同 redis 類似都采用了 io 多路復(fù)用機(jī)制,每個 worker 都是一個獨(dú)立的進(jìn)程,但每個進(jìn)程里只有一個主線程,通過異步非阻塞的方式來處理請求, 即使是千上萬個請求也不在話下。每個 worker 的線程可以把一個 cpu 的性能發(fā)揮到極致。所以 worker 數(shù)和服務(wù)器的 cpu數(shù)相等是最為適宜的。設(shè)少了會浪費(fèi) cpu,設(shè)多了會造成 cpu 頻繁切換上下文帶來的損耗。
設(shè)置 worker 數(shù)量。
worker_processes 4
work 綁定 cpu(4 work 綁定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
work 綁定 cpu (4 work 綁定 8cpu 中的 4 個) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
連接數(shù) worker_connection
這個值是表示每個 worker 進(jìn)程所能建立連接的最大值,所以,一個 nginx 能建立的最大連接數(shù),應(yīng)該是 worker_connections * worker_processes。當(dāng)然,這里說的是最大連接數(shù),對于HTTP 請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個連接,所以普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections *
worker_processes/4。因?yàn)樽鳛榉聪虼矸?wù)器,每個并發(fā)會建立與客戶端的連接和與后端服務(wù)的連接,會占用兩個連接。

詳情見配置文件 nginx.conf