作者 | albon_arith
責(zé)編 | Elle
出品 | CSDN 博客
Nginx 是一個(gè)免費(fèi)的,開源的,高性能的 HTTP 服務(wù)器和反向代理,以及 IMAP / POP3 代理服務(wù)器。Nginx 以其高性能,穩(wěn)定性,豐富的功能,簡(jiǎn)單的配置和低資源消耗而聞名。
Nginx 的整體架構(gòu)
Nginx 里有一個(gè) master 進(jìn)程和多個(gè) worker 進(jìn)程。master 進(jìn)程并不處理網(wǎng)絡(luò)請(qǐng)求,主要負(fù)責(zé)調(diào)度工作進(jìn)程:加載配置、啟動(dòng)工作進(jìn)程及非停升級(jí)。worker 進(jìn)程負(fù)責(zé)處理網(wǎng)絡(luò)請(qǐng)求與響應(yīng)。
master進(jìn)程主要用來管理worker進(jìn)程,具體包括如下4個(gè)主要功能:
- 接收來自外界的信號(hào)。
- 向各worker進(jìn)程發(fā)送信號(hào)。
- 監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
- 當(dāng)woker進(jìn)程退出后(異常情況下),會(huì)自動(dòng)重新啟動(dòng)新的woker進(jìn)程。
woker進(jìn)程主要用來處理基本的網(wǎng)絡(luò)事件:
- 多個(gè)worker進(jìn)程之間是對(duì)等且相互獨(dú)立的,他們同等競(jìng)爭(zhēng)來自客戶端的請(qǐng)求。
- 一個(gè)請(qǐng)求,只可能在一個(gè)worker進(jìn)程中處理,一個(gè)worker進(jìn)程,不可能處理其它進(jìn)程的請(qǐng)求。
- worker進(jìn)程的個(gè)數(shù)是可以設(shè)置的,一般我們會(huì)設(shè)置與機(jī)器cpu核數(shù)一致。同時(shí),nginx為了更好的利用多核特性,具有cpu綁定選項(xiàng),我們可以將某一個(gè)進(jìn)程綁定在某一個(gè)核上,這樣就不會(huì)因?yàn)檫M(jìn)程的切換帶來cache的失效。
Ngnix 是如何實(shí)現(xiàn)高性能的?
事件驅(qū)動(dòng)模型
基于異步及非阻塞的事件驅(qū)動(dòng)模型,可以說是 Nginx 得以獲得高并發(fā)、高性能的關(guān)鍵因素。這一點(diǎn)上和 Netty 類似,底層都是使用的 BSD kqueue、Linux epoll 及 Solaris event ports。
多進(jìn)程機(jī)制
使用多進(jìn)程的好處有兩點(diǎn):
- 進(jìn)程之間不共享資源,不需要加鎖,減少了使用鎖對(duì)性能造成的影響,同時(shí)降低編程的復(fù)雜度,降低開發(fā)成本。
- 采用獨(dú)立的進(jìn)程,可以讓進(jìn)程互相之間不會(huì)影響,如果一個(gè)進(jìn)程發(fā)生異常退出時(shí),其它進(jìn)程正常工作,master 進(jìn)程則很快啟動(dòng)新的 worker 進(jìn)程,確保服務(wù)不會(huì)中斷,從而將風(fēng)險(xiǎn)降到最低。
內(nèi)存池
為了避免出現(xiàn)內(nèi)存碎片,減少向操作系統(tǒng)申請(qǐng)內(nèi)存的次數(shù)、降低各個(gè)模塊的開發(fā)復(fù)雜度,Nginx 設(shè)計(jì)了簡(jiǎn)單的內(nèi)存池,它的作用主要是把多次向系統(tǒng)申請(qǐng)內(nèi)存的操作整合成一次,這大大減少了 CPU 資源的消耗,同時(shí)減少了內(nèi)存碎片。
模塊化設(shè)計(jì)
高度模塊化的設(shè)計(jì)是 Nginx 的架構(gòu)基礎(chǔ)。Openresty 就是在 Nginx 上引入了 lua 等第三方模塊,使得擴(kuò)展更加方便了。


