一、Nginx模塊化結(jié)構(gòu)
習(xí)慣上將 Nginx 涉及到的模塊分為核心模塊、標(biāo)準(zhǔn) HTTP 模塊、可選 HTTP 模塊、郵件服務(wù)模塊以及第三方模塊等五大類。
二、Nginx服務(wù)器的Web請求處理控制
Web 服務(wù)器和客戶端是一對多的關(guān)系,Web 服務(wù)器必須有能力同時為多個客戶端提供服務(wù)。一般來說,完成并行處理請求工作有三種方式可供選擇:多進(jìn)程方式、多線程方式和異步方式。
2.1 多進(jìn)程方式
多進(jìn)程方式是指,服務(wù)器每當(dāng)接收一個客戶端時,就由服務(wù)器主進(jìn)程生成一個子進(jìn)程出來和該客戶端建立連接進(jìn)行交互,直到連接斷開,該子進(jìn)程就結(jié)束了。
多進(jìn)程方式的優(yōu)點(diǎn)是設(shè)計(jì)和實(shí)現(xiàn)相對簡單,各個子進(jìn)程之間相互獨(dú)立,處理客戶端請求的過程彼此不受到干擾,并且當(dāng)一個子進(jìn)程產(chǎn)生問題時,不容易將影響蔓延到其它進(jìn)程中,這保證了提供服務(wù)的穩(wěn)定性。當(dāng)子進(jìn)程退出時,其占用資源會被操作系統(tǒng)回收,也不會留下任何垃圾。而其缺點(diǎn)也是很明顯的。操作系統(tǒng)中生成一個子進(jìn)程需要進(jìn)行內(nèi)存復(fù)制等操作,在資源和時間上會產(chǎn)生一定的額外開銷,因此,如果Web 服務(wù)器接受大量并發(fā)請求,就會對系統(tǒng)資源造成壓力,導(dǎo)致系統(tǒng)性能下降。
2.2 多線程方式
多線程方式和多進(jìn)程方式相似,它是指,服務(wù)器每當(dāng)接收到一個客戶端時,會由服務(wù)器主進(jìn)程派生一個線程出來和該客戶端進(jìn)行交互。
由于操作系統(tǒng)產(chǎn)生一個線程的開銷遠(yuǎn)遠(yuǎn)小于產(chǎn)生一個進(jìn)程的開銷,所以多線程方式在很大程度上減輕了Web服務(wù)器對系統(tǒng)資源的要求。該方式使用線程進(jìn)行任務(wù)調(diào)度,開發(fā)方面可以遵循一定的標(biāo)準(zhǔn),這相對來說比較規(guī)范和有利于協(xié)作。但在線程處理方面,該方式有一定的不足。多個線程位于同一個進(jìn)程內(nèi),可以訪問同樣的內(nèi)茌空間,彼此之間相互影響;同時,在開發(fā)過程中不可避免地要由開發(fā)者自己對內(nèi)存進(jìn)行管理,其增加了出錯的風(fēng)險(xiǎn)。服務(wù)器系統(tǒng)需要長時間連續(xù)不停地運(yùn)轉(zhuǎn),錯誤的逐漸積累可能最終對整個服務(wù)器產(chǎn)生重大影響。
2.3 異步方式
異步方式是和多進(jìn)程方式及多線程方式完全不同的一種處理客戶端請求的方式。
網(wǎng)絡(luò)通信中的同步機(jī)制和異步機(jī)制是描述通信模式的概念。同步機(jī)制,是指發(fā)送方發(fā)送請求后,需要等待接受到接收方發(fā)回的響應(yīng)后,才接著發(fā)送下一個請求;異步機(jī)制,和同步機(jī)制正好相反,在異步機(jī)制中,發(fā)送方發(fā)出一個請求后,不等待接收方響應(yīng)這個請求,就繼續(xù)發(fā)送下個請求。在同步機(jī)制中,所有的請求在服務(wù)器端得到同步,發(fā)送方和接收方對請求的處理步調(diào)是一致的;在異步機(jī)制中,所有來自發(fā)送方的請求形成一個隊(duì)列,接收方處理完成后通知發(fā)送方。
阻塞和非阻塞用來描述進(jìn)程處理調(diào)用的方式,在網(wǎng)絡(luò)通信中,主要指網(wǎng)絡(luò)套接字Socket的阻塞和非阻塞方式,而 Socket 的實(shí)質(zhì)也就是 IO 操作。Socket 的阻塞調(diào)用方式為,調(diào)用結(jié)果返回之前,當(dāng)前線程從運(yùn)行狀態(tài)被掛起,一直等到調(diào)用結(jié)果返回之后,才進(jìn)入就緒狀態(tài),獲取 CPU 后繼續(xù)執(zhí)行;Socket 的非阻塞調(diào)用方式和阻塞調(diào)用方式正好相反,在非阻塞方式中,如果調(diào)用結(jié)果不能馬上返回,當(dāng)前線程也不會被掛起,而是立即返回執(zhí)行下一個調(diào)用。
兩隊(duì)概念的組合,就會產(chǎn)生四個新的概念,同步阻塞、異步阻塞、同步非阻塞、異步非阻塞。
同步阻塞方式,發(fā)送方向接收方發(fā)送請求后,一直等待響應(yīng);接收方處理請求時進(jìn)行的 IO 操作如果不能馬上得到結(jié)果,就一直等到返回結(jié)果后,才響應(yīng)發(fā)送方,期間不能進(jìn)行其它工作。
同步非阻塞方式,發(fā)送方向接收方發(fā)送請求后,一直等待響應(yīng);接收方處理請求時進(jìn)行的 IO 操作如果不能馬上得到結(jié)果,就立即返回,去做其它事情,但由于沒有得到請求處理結(jié)果,不響應(yīng)發(fā)送方,發(fā)送方一直等待。一直到IO 操作完成后,接收方獲得結(jié)果響應(yīng)發(fā)送方后,接收方才進(jìn)入下一次請求過程。在實(shí)際中不使用這種方式。
異步阻塞方式,發(fā)送方向接收方發(fā)送請求后,不用等待響應(yīng),可以接著進(jìn)行其它工作;接收方處理請求時進(jìn)行的 IO 操作如果不能馬上得到結(jié)果,就一直等到返回結(jié)果后,才響應(yīng)發(fā)送方,期間不能進(jìn)行其它工作。這種方式在實(shí)際中也不使用。
異步非阻塞方式,發(fā)送方向接收方發(fā)送請求后,不用等待響應(yīng),可以繼續(xù)其它工作;接收方處理請求時進(jìn)行的 IO 操作如果不能馬上得到結(jié)果,也不等待,而是馬上返回去做其它事情。當(dāng) IO 操作完成以后,將完成狀態(tài)和結(jié)果通知接收方,接收方再響應(yīng)發(fā)送方。在四種方式中,這種方式是發(fā)送方和接收方通信效率最高的一種。
Nginx 服務(wù)器的一個顯著優(yōu)勢是能夠同時處理大量并發(fā)請求。它結(jié)合多進(jìn)程機(jī)制和異步機(jī)制對外提供服務(wù)。異步機(jī)制使用的是異步非阻塞方式。