1、架構(gòu)設(shè)計 1.1、設(shè)計概覽 1.2、模塊化結(jié)構(gòu) 1.3、Web請求處理方式 1.4、事件驅(qū)動模型 2、常用功能 2.1、HTTP代理與反向代理 2.2、負(fù)載均衡 2.3、Web緩存 Niginx是一款開源的高性能HTTP服務(wù)器及反向代理服務(wù)器產(chǎn)品,此外,它還可以提供IMAP/POP3代理服務(wù)等功能。 1、架構(gòu)設(shè)計 1.1、設(shè)計概覽 主進程:MasterProcess,主要功能是與外界通信和對內(nèi)部其它進程管理,包括進行配置文件解析、數(shù)據(jù)結(jié)構(gòu)初始化、模塊配置和注冊、信號處理、網(wǎng)絡(luò)監(jiān)聽生成、工作進程生成和管理工作。 工作進程:WorkerProcess,由主進程生成,生成數(shù)量可在配置文件中指定,正常情況下生存于主進程的整個生命周期,主要進行進程初始化、模塊調(diào)用和請求處理等工作,是Nginx服務(wù)器提供服務(wù)的主體。 緩存機制:為提高請求與響應(yīng)處理效率,通過緩存機制,將歷史響應(yīng)數(shù)據(jù)緩存到本地。在每次Nginx服務(wù)器啟動后的一段時間內(nèi),會啟動專門的進程對本地緩存的內(nèi)容重建索引,保證對緩存文件的快速訪問。 點擊加載圖片 1.2、模塊化結(jié)構(gòu) Nignx服務(wù)器的開發(fā)完全遵循模塊化設(shè)計思想。 命名習(xí)慣:一般ngx_開頭,_module結(jié)尾,如ngx_core_module、ngx_events_module等。 模塊分類:核心模塊、標(biāo)準(zhǔn)HTTP模塊、可選HTTP模塊、郵件服務(wù)模塊與第三方模塊5大類。 核心模塊:提供最基礎(chǔ)最核心服務(wù),主要包括兩類功能,一類為主體功能,如進程管理、權(quán)限控制、錯誤日志記錄、配置解析等;一類為響應(yīng)請求事件必需的功能,包括事件驅(qū)動機制、正則表達(dá)式解析等。 標(biāo)準(zhǔn)HTTP模塊:默認(rèn)會被編譯到Nginx中,除非在配置時添加-without-XXX參數(shù)聲明不編譯,如
可選HTTP模塊:默認(rèn)不會被編譯到Nginx中,須在配置時添加-with-XXX參數(shù)聲明編譯
郵件服務(wù)模塊:Nginx發(fā)行版中,快速編譯默認(rèn)不會編譯相關(guān)模塊,如
第三方模塊:自定義擴展模塊,如
1.3、Web請求處理方式 處理請求的三種方式: 1、多進程方式:服務(wù)器每收到一個請求,就會由主進程生成一個子進程與客戶端進行交互處理,直到連接斷開,該子進程就結(jié)束了。該方式設(shè)計和實現(xiàn)相對簡單,但是操作系統(tǒng)生成子進程開銷較大,當(dāng)并發(fā)量較大時,服務(wù)器壓力很大;(初期的Apache服務(wù)器就是該方式,為了應(yīng)對高并發(fā),采用了“預(yù)生成進程”機制) 2、多線程方式:服務(wù)器每收到一個請求,就會由主進程派生一個線程與客戶端進行交互處理。該方式開銷小于生成進程,但是需要處理多線程問題。 3、異步方式: 同步與異步:是描述通信模式的概念。同步指發(fā)送方發(fā)送請求后,需要等到接收方響應(yīng)后才能發(fā)送下一個請求;異步則相反,發(fā)送方不必等待接收方的響應(yīng)就可以發(fā)現(xiàn)下一個請求; 阻塞與非阻塞:是描述進程處理調(diào)用的方式。阻塞方式是調(diào)用結(jié)果返回之前,當(dāng)前線程從運行狀態(tài)被掛起,一直等到調(diào)用結(jié)果返回之后,才會進入就緒狀態(tài),獲取CPU后繼續(xù)執(zhí)行;非阻塞方式則相反,如果調(diào)用結(jié)果無法立即返回,當(dāng)前線程也不會掛起,而是立即返回執(zhí)行下一個調(diào)用。 經(jīng)常會使用“同步阻塞方式“與“異步非阻塞方式”。 Nginx服務(wù)器如何處理請求: 其為了應(yīng)對高并發(fā),使用的異步非阻塞方式對外提供服務(wù)。Nginx啟動后,會產(chǎn)生一個主進程和多個工作進程(相當(dāng)于預(yù)生成),每個工作進行使用異步非阻塞方式,可以處理多個客戶端請求。 1.4、事件驅(qū)動模型 事件驅(qū)動模型:一般由事件收集器、事件發(fā)送器和事件處理器三部分組成。 點擊加載圖片 事件處理的3中方法: 1、發(fā)送器傳遞一個請求,目標(biāo)對象創(chuàng)建一個新進程,調(diào)用處理器處理。這種方式編碼實現(xiàn)相對簡單,但是創(chuàng)建進程開銷大,導(dǎo)致服務(wù)器性能較差; 2、發(fā)送器傳遞一個請求,目標(biāo)對象創(chuàng)建一個新線程,調(diào)用處理器處理。這種方式性能更高,但是會面臨多線程控制問題(同步、死鎖),編碼難度增大; 3、發(fā)送器傳遞一個請求,目標(biāo)對象將其放入一個待處理的列表中,使用非阻塞I/O方式調(diào)用處理器處理。這種方式編碼復(fù)雜度更高,但是效率更好。大多數(shù)網(wǎng)絡(luò)服務(wù)器采用的這種方式,Nginx也一樣。 Nginx事件驅(qū)動模型:采用的“事件驅(qū)動處理庫“方式,也稱“多路IO復(fù)用方法”,最常見的有select模型、poll模型與epoll模型,Nginx還支持rtsig模型、kqueue模型、dev/poll模型和eventport模型等。 2、常用功能 2.1、HTTP代理與反向代理 最主要功能之一 2.2、負(fù)載均衡 兩種場景:一種是單一的重負(fù)載分?jǐn)偟蕉鄠€節(jié)點做并行處理,然后匯集每個節(jié)點的結(jié)果返回;一種是將并發(fā)流量分?jǐn)偟蕉鄠€節(jié)點,提供服務(wù)器處理性能。一般談到的負(fù)載均衡都是指后者。 Nginx負(fù)載均衡策略:內(nèi)置策略(輪詢、加權(quán)輪詢、IPhash)和擴展策略(urlhash、fair等)。輪詢:即每個請求按順序逐一分配到不同的后端節(jié)點即可;加權(quán)輪詢:指定請求到后端節(jié)點的權(quán)重,一般用于后端節(jié)點性能不均衡場景;IPhash:將請問IP進行hash操作,分配到不同后端節(jié)點,之后對應(yīng)IP請求會固定訪問某個后端節(jié)點,解決用戶session在不同節(jié)點無法共享的問題; 2.3、Web緩存 緩存機制對應(yīng)提高web服務(wù)器負(fù)載能力、提高用戶請求響應(yīng)速度至關(guān)重要,目前Nginx在這方面能力以及堪比Squid。它自身可以通過ProxyStore和ProxyCache實現(xiàn),也可以與Squid、nacache聯(lián)合使用。 |
|