Nginx是一款免費(fèi)的、開(kāi)源的、高性能、模塊化、輕量級(jí)的HTTP服務(wù)器、反向代理服務(wù)器以及電子郵件(IMAP/POP3)代理服務(wù)器。
很多大型的網(wǎng)站都使用Nginx,如:百度、京東、新浪、網(wǎng)易、騰訊、淘寶等。
1.Nginx的整體架構(gòu)簡(jiǎn)介
1)Nginx啟動(dòng)后,會(huì)產(chǎn)生一個(gè)主進(jìn)程,主進(jìn)程執(zhí)行一系列的工作后會(huì)產(chǎn)生一個(gè)或者多個(gè)工作進(jìn)程;
2)在客戶端請(qǐng)求動(dòng)態(tài)站點(diǎn)的過(guò)程中,Nginx服務(wù)器還涉及和后端服務(wù)器的通信。Nginx將接收到的Web請(qǐng)求通過(guò)代理轉(zhuǎn)發(fā)到后端服務(wù)器,由后端服務(wù)器進(jìn)行數(shù)據(jù)處理和組織;
3)Nginx為了提高對(duì)請(qǐng)求的響應(yīng)效率,降低網(wǎng)絡(luò)壓力,采用了緩存機(jī)制,將歷史應(yīng)答數(shù)據(jù)緩存到本地。保障對(duì)緩存文件的快速訪問(wèn);
2. Nginx的模塊化
高度模塊化的設(shè)計(jì)是 Nginx 的架構(gòu)基礎(chǔ)。Nginx嚴(yán)格遵循“高內(nèi)聚,低耦合”的原則,將服務(wù)器設(shè)計(jì)為多個(gè)模塊,每個(gè)模塊就是一個(gè)獨(dú)立的功能模塊,只負(fù)責(zé)自身的功能。
這5個(gè)模塊從上到下重要性依次遞減。
(1)核心模塊
核心模塊是Nginx服務(wù)器正常運(yùn)行必不可少的模塊,如同操作系統(tǒng)的內(nèi)核。它提供了Nginx最基本的核心服務(wù)。像進(jìn)程管理、權(quán)限控制、錯(cuò)誤日志記錄等;
(2)標(biāo)準(zhǔn)HTTP模塊
標(biāo)準(zhǔn)HTTP模塊支持標(biāo)準(zhǔn)的HTTP的功能;
(3)可選HTTP模塊
可選HTTP模塊主要用于擴(kuò)展標(biāo)準(zhǔn)的HTTP功能,讓Nginx能處理一些特殊的服務(wù);
(4)郵件服務(wù)模塊
郵件服務(wù)模塊主要用于支持Nginx的郵件服務(wù);
(5)第三方模塊
第三方模塊是為了擴(kuò)展Nginx服務(wù)器應(yīng)用,完成開(kāi)發(fā)者想要的功能;
3.Nginx的Web請(qǐng)求處理機(jī)制
從架構(gòu)設(shè)計(jì)上說(shuō),Nginx服務(wù)器是與眾不同的。其一在于它的模塊化設(shè)計(jì);其二也是更重要的一點(diǎn)在于它對(duì)與客戶端請(qǐng)求的處理機(jī)制上。 Nginx請(qǐng)求處理機(jī)制結(jié)合多進(jìn)程機(jī)制和異步非阻塞機(jī)制。
1)多進(jìn)程
多進(jìn)程方式指服務(wù)器每當(dāng)收到一個(gè)客戶端請(qǐng)求時(shí)就由服務(wù)器主進(jìn)程生成一個(gè)子進(jìn)程出來(lái)和客戶端建立連接進(jìn)行交互,直到連接斷開(kāi),該子進(jìn)程就結(jié)束了。多進(jìn)程方式的優(yōu)點(diǎn)是設(shè)計(jì)簡(jiǎn)單,各個(gè)子進(jìn)程相對(duì)獨(dú)立,處理客戶端請(qǐng)求時(shí)彼此不受干擾;缺點(diǎn)是操作系統(tǒng)生成一個(gè)子進(jìn)程需要進(jìn)行內(nèi)存復(fù)制等操作,在資源和時(shí)間上會(huì)產(chǎn)生一定的開(kāi)銷;當(dāng)有大量請(qǐng)求時(shí),會(huì)導(dǎo)致系統(tǒng)性能下降;
2)異步非阻塞
發(fā)送方向接收方發(fā)送請(qǐng)求后,不用等待響應(yīng),可以繼續(xù)其他工作;接收方處理請(qǐng)求時(shí)進(jìn)行的IO操作如果不能馬上得到結(jié)果,也不必等待,而是馬上返回去去做其他事情。當(dāng)IO操作完成以后,將完成狀態(tài)和結(jié)果通知接收方,接收方再響應(yīng)發(fā)送方。
4. Nginx服務(wù)器的事件驅(qū)動(dòng)模型
從上面我們可以知道,Nginx服務(wù)器的工作進(jìn)程調(diào)用IO后,就取進(jìn)行其他工作了;當(dāng)IO調(diào)用返回后,會(huì)主動(dòng)通知工作進(jìn)程。像select/poll/epoll等這樣的系統(tǒng)調(diào)用就是用來(lái)支持這種解決方案的。這些系統(tǒng)調(diào)用也常被稱為事件驅(qū)動(dòng)模型,他們提供了一種機(jī)制就只讓進(jìn)程同時(shí)處理多個(gè)并發(fā)請(qǐng)求,不用關(guān)心IO調(diào)用的具體狀態(tài)。IO調(diào)用完全由事件驅(qū)動(dòng)模型來(lái)管理。
如上圖所示,Nginx的事件驅(qū)動(dòng)模型由事件收集器、事件發(fā)送器和事件處理器三部分基本單元組成。
select,poll,epoll都是IO多路復(fù)用的機(jī)制。I/O多路復(fù)用就是通過(guò)一種機(jī)制,一個(gè)進(jìn)程可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。select,poll,epoll本質(zhì)上都是同步I/O,因?yàn)樗麄兌夹枰谧x寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫,也就是說(shuō)這個(gè)讀寫過(guò)程是阻塞的。
5. Nginx服務(wù)器Master-Worker進(jìn)程處理模型
Nginx服務(wù)器在使用Master-Worker模型時(shí),會(huì)涉及到主進(jìn)程和工作進(jìn)程的交互和工作進(jìn)程之間的交互。這兩類交互都依賴于管道機(jī)制。
Master-Worker交互
這條管道與普通的管道不同,它是由主進(jìn)程指向工作進(jìn)程的單向管道,包含主進(jìn)程向工作進(jìn)程發(fā)出的指令,工作進(jìn)程ID等;同時(shí)主進(jìn)程與外界通過(guò)信號(hào)通信;
Worker-Worker交互
這種交互是和Master-Worker交互是基本一致的,但是會(huì)通過(guò)主進(jìn)程。工作進(jìn)程之間是相互隔離的,所以當(dāng)工作進(jìn)程W1需要向工作進(jìn)程W2發(fā)指令時(shí),首先找到W2的進(jìn)程ID,然后將正確的指令寫入指向W2的通道。W2收到信號(hào)采取相應(yīng)的措施。
通過(guò)這篇文章,我們對(duì)Nginx服務(wù)器的整體架構(gòu)有了一個(gè)整體的認(rèn)識(shí)。另外推薦大家多看看Nginx的源碼,以便能更好地領(lǐng)悟 Nginx的設(shè)計(jì)思想。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9231瀏覽量
85625 -
nginx
+關(guān)注
關(guān)注
0文章
151瀏覽量
12189
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論