今天來給大家講解一下Nginx的工作原理以及的一些可優(yōu)化的參數(shù)配置,也都是在實(shí)際工作中總結(jié)出來的經(jīng)驗(yàn)。
一、nginx工作原理
1.1、nginx進(jìn)程模型
nginx在啟動(dòng)后,會(huì)有一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程。master進(jìn)程主要用來管理worker進(jìn)程,如下圖所示:


1.2、master和worker的工作職責(zé)
master是一個(gè)領(lǐng)導(dǎo),它只負(fù)責(zé)管理worker,具體的工作任務(wù)由下面的worker(工人)去做。
master的職責(zé):接收來自外界的信號(hào),向各worker進(jìn)程發(fā)送信號(hào),監(jiān)控worker進(jìn)程的運(yùn)行狀態(tài),當(dāng)worker進(jìn)程退出后(異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的worker進(jìn)程。
worker的職責(zé):處理來自客戶端的請(qǐng)求,多個(gè)worker進(jìn)程之間是對(duì)等的,他們同等競(jìng)爭(zhēng)來自客戶端的請(qǐng)求,如下圖所示:

各個(gè)worker進(jìn)程互相之間是獨(dú)立的,一個(gè)請(qǐng)求只可能在一個(gè)worker進(jìn)程中處理,一個(gè)worker進(jìn)程,不可能處理其它進(jìn)程的請(qǐng)求。
1.3、master-workers的機(jī)制的好處
1、對(duì)于每個(gè) worker 進(jìn)程來說,獨(dú)立的進(jìn)程,不需要加鎖,所以省掉了加鎖帶來的開銷,同時(shí)在編程以及問題查找時(shí),也會(huì)方便很多。
2、采用獨(dú)立的進(jìn)程,可以讓互相之間不會(huì)影響,一個(gè)進(jìn)程退出后,其它進(jìn)程還在工作,服務(wù)不會(huì)中斷,master 進(jìn)程則很快啟動(dòng)新的worker 進(jìn)程。當(dāng)然,worker 進(jìn)程的異常退出,肯定是程序有 bug 了,異常退出,會(huì)導(dǎo)致當(dāng)前 worker 上的所有請(qǐng)求失敗,不過不會(huì)影響到所有請(qǐng)求,所以降低了風(fēng)險(xiǎn)。
二、優(yōu)化參數(shù)配置
2.1、worker_processes進(jìn)程數(shù)設(shè)置
Nginx 采用了 io 多路復(fù)用機(jī)制,每個(gè) worker 都是一個(gè)獨(dú)立的進(jìn)程,但每個(gè)進(jìn)程里只有一個(gè)主線程,通過異步非阻塞的方式來處理請(qǐng)求, 即使是千上萬個(gè)請(qǐng)求也不在話下。每個(gè) worker的線程可以把一個(gè) cpu的性能發(fā)揮到極致,所以?worker 數(shù)和服務(wù)器的cpu核數(shù)相等是最為適宜的。設(shè)少了會(huì)浪費(fèi) cpu,設(shè)多了會(huì)造成 cpu 頻繁切換上下文帶來的損耗。
修改Nginx的nginx.conf配置文件,設(shè)置worker_processes進(jìn)程數(shù)量
# 設(shè)置 worker 數(shù)量。
worker_processes 2


CentOS 查看系統(tǒng) CPU個(gè)數(shù)、核心數(shù)、線程數(shù)的幾個(gè)命令:
1、查看CPU物理個(gè)數(shù)
grep ‘physical id’ /proc/cpuinfo | sort -u | wc -l

查看 CPU物理個(gè)數(shù)
2、查看CPU核數(shù)
grep ‘core id’ /proc/cpuinfo | sort -u | wc -l

查看 CPU核數(shù)
3、查看CPU線程數(shù)
grep ‘processor’ /proc/cpuinfo | sort -u | wc -l

查看 CPU線程數(shù)
2.2、Nginx能支持的最大并發(fā)數(shù)
nginx的配置文件中有一個(gè)worker_connection屬性的配置,這個(gè)是表示每個(gè) worker 進(jìn)程所能建立連接的最大值,所以,一個(gè) nginx 能建立的最大連接數(shù),理論上應(yīng)該是 worker_connections * worker_processes。
那么問題來了,發(fā)送一個(gè)http請(qǐng)求,占用了woker的幾個(gè)連接數(shù)呢?答案應(yīng)該是2個(gè)或者4個(gè)
如果是支持 http1.1 的瀏覽器每次訪問要占兩個(gè)連接,所以Nginx處理普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes /2
如果是作為HTTP反向代理服務(wù)器,Nginx能處理的最大并發(fā)數(shù)量應(yīng)該是 worker_connections *worker_processes/4。因?yàn)樽鳛榉聪虼矸?wù)器,每個(gè)并發(fā)會(huì)建立與客戶端的連接和與后端服務(wù)的連接,會(huì)占用兩個(gè)連接。
舉個(gè)例子:
nginx 有一個(gè) master ,有四個(gè) worker ,每個(gè) worker 支持最大的連接數(shù)1024 ,那么nginx支持的最大并發(fā)數(shù)是多少?
普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes /2
所以就是1024*4/2=2048
而如果是 HTTP 作 為反向代理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections *worker_processes/4
所以就是1024*4/4=1024
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至2705686032@qq.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。原文轉(zhuǎn)載: 原文出處: