Nginx是一個(gè)免費(fèi)的嫂丙,開(kāi)源的,高性能的HTTP服務(wù)器和反向代理互例。以其高性能,穩(wěn)定性筝闹,豐富的功能媳叨,簡(jiǎn)單的配置和低資源消耗而聞名。Nginx是一個(gè)Web服務(wù)器关顷,也可以用作負(fù)載均衡器和HTTP緩存糊秆。
很多高知名度的網(wǎng)站都使用Nginx,比如:Netflix议双,GitHub痘番,SoundCloud,MaxCDN等。
1.Nginx的整體架構(gòu)
1.1.主進(jìn)程
Nginx啟動(dòng)時(shí)汞舱,會(huì)生成兩種類型的進(jìn)程伍纫,一個(gè)是主進(jìn)程(master),一個(gè)(windows版本的目前只有一個(gè))或多個(gè)工作進(jìn)程(worker)昂芜。
主進(jìn)程并不處理網(wǎng)絡(luò)請(qǐng)求莹规,主要負(fù)責(zé)調(diào)度工作進(jìn)程,也就是圖示的3項(xiàng):加載配置泌神、啟動(dòng)工作進(jìn)程良漱、非停升級(jí)
因此,Nginx啟動(dòng)以后欢际,查看操作系統(tǒng)的進(jìn)程列表母市,我們就能看到至少有兩個(gè)Nginx進(jìn)程。
1.2.工作進(jìn)程
服務(wù)器實(shí)際處理網(wǎng)絡(luò)請(qǐng)求及響應(yīng)的是工作進(jìn)程(worker)损趋,在類unix系統(tǒng)上患久,Nginx可以配置多個(gè)worker,而每個(gè)worker進(jìn)程都可以同時(shí)處理數(shù)以千計(jì)的網(wǎng)絡(luò)請(qǐng)求舶沿。
1.3.模塊化設(shè)計(jì)
Nginx的worker進(jìn)程墙杯,包括核心和功能性模塊,核心模塊負(fù)責(zé)維持一個(gè)運(yùn)行循環(huán)(run-loop)括荡,執(zhí)行網(wǎng)絡(luò)請(qǐng)求處理的不同階段的模塊功能高镐。
比如:網(wǎng)絡(luò)讀寫(xiě)、存儲(chǔ)讀寫(xiě)畸冲、內(nèi)容傳輸嫉髓、外出過(guò)濾,以及將請(qǐng)求發(fā)往上游服務(wù)器等邑闲。
而其代碼的模塊化設(shè)計(jì)算行,也使得我們可以根據(jù)需要對(duì)功能模塊進(jìn)行適當(dāng)?shù)倪x擇和修改,編譯成具有特定功能的服務(wù)器苫耸。
1.4.事件驅(qū)動(dòng)模型
基于異步及非阻塞的事件驅(qū)動(dòng)模型州邢,可以說(shuō)是Nginx得以獲得高并發(fā)、高性能的關(guān)鍵因素褪子,同時(shí)也得益于對(duì)Linux量淌、Solaris及類BSD等操作系統(tǒng)內(nèi)核中事件通知及I/O性能增強(qiáng)功能的采用,如kqueue嫌褪、epoll及eventports呀枢。
1.5.代理(proxy)設(shè)計(jì)
代理設(shè)計(jì),可以說(shuō)是Nginx深入骨髓的設(shè)計(jì)笼痛,無(wú)論是對(duì)于HTTP裙秋,還是對(duì)于FastCGI琅拌、Memcache、Redis等的網(wǎng)絡(luò)請(qǐng)求或響應(yīng)摘刑,本質(zhì)上都采用了代理機(jī)制进宝。所以,Nginx天生就是高性能的代理服務(wù)器泣侮。
2.Nginx的模塊化設(shè)計(jì)
高度模塊化的設(shè)計(jì)是Nginx的架構(gòu)基礎(chǔ)即彪。Nginx服務(wù)器被分解為多個(gè)模塊,每個(gè)模塊就是一個(gè)功能模塊活尊,只負(fù)責(zé)自身的功能隶校,模塊之間嚴(yán)格遵循“高內(nèi)聚,低耦合”的原則蛹锰。
如下圖所示:
2.1.核心模塊
核心模塊是Nginx服務(wù)器正常運(yùn)行必不可少的模塊深胳,提供錯(cuò)誤日志記錄、配置文件解析铜犬、事件驅(qū)動(dòng)機(jī)制舞终、進(jìn)程管理等核心功能。
2.2.標(biāo)準(zhǔn)HTTP模塊
標(biāo)準(zhǔn)HTTP模塊提供HTTP協(xié)議解析相關(guān)的功能癣猾,比如:端口配置敛劝、網(wǎng)頁(yè)編碼設(shè)置、HTTP響應(yīng)頭設(shè)置等等纷宇。
2.3.可選HTTP模塊
可選HTTP模塊主要用于擴(kuò)展標(biāo)準(zhǔn)的HTTP功能夸盟,讓Nginx能處理一些特殊的服務(wù),比如:Flash多媒體傳輸像捶、解析GeoIP請(qǐng)求上陕、網(wǎng)絡(luò)傳輸壓縮、安全協(xié)議SSL支持等拓春。
2.4.郵件服務(wù)模塊
郵件服務(wù)模塊主要用于支持Nginx的郵件服務(wù)释簿,包括對(duì)POP3協(xié)議、IMAP協(xié)議和SMTP協(xié)議的支持硼莽。
2.5.第三方模塊
第三方模塊是為了擴(kuò)展Nginx服務(wù)器應(yīng)用庶溶,完成開(kāi)發(fā)者自定義功能,比如:Json支持懂鸵、Lua支持等偏螺。
3.Nginx的請(qǐng)求方式處理
Nginx是一個(gè)高性能的Web服務(wù)器,能夠同時(shí)處理大量的并發(fā)請(qǐng)求矾瑰。它結(jié)合多進(jìn)程機(jī)制和異步機(jī)制砖茸,異步機(jī)制使用的是異步非阻塞方式隘擎,接下來(lái)就給大家介紹一下Nginx的多線程機(jī)制和異步非阻塞機(jī)制殴穴。
3.1.多進(jìn)程機(jī)制
服務(wù)器每當(dāng)收到一個(gè)客戶端時(shí),就有服務(wù)器主進(jìn)程(master process)生成一個(gè)子進(jìn)程(worker process)出來(lái)和客戶端建立連接進(jìn)行交互,直到連接斷開(kāi)采幌,該的進(jìn)程就結(jié)束了劲够。
使用進(jìn)程的好處是各個(gè)進(jìn)程之間相互獨(dú)立,不需要加鎖休傍,減少了使用鎖對(duì)性能造成影響征绎,同時(shí)降低編程的復(fù)雜度,降低開(kāi)發(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)降到最低。
缺點(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)性能下降胀茵。
3.2.異步非阻塞機(jī)制
每個(gè)工作進(jìn)程使用異步非阻塞方式社露,可以處理多個(gè)客戶端請(qǐng)求。
當(dāng)某個(gè)工作進(jìn)程接收到客戶端的請(qǐng)求以后宰掉,調(diào)用IO進(jìn)行處理呵哨,如果不能立即得到結(jié)果,就去處理其他請(qǐng)求(即為非阻塞)轨奄,而客戶端在此期間也無(wú)需等待響應(yīng)孟害,可以去處理其他事情(即為異步)
當(dāng)IO返回時(shí),就會(huì)通知此工作進(jìn)程挪拟,該進(jìn)程得到通知挨务,暫時(shí)掛起當(dāng)前處理的事務(wù)去響應(yīng)客戶端請(qǐng)求。
4.Nginx事件驅(qū)動(dòng)模型
在Nginx的異步非阻塞機(jī)制中玉组,工作進(jìn)程在調(diào)用IO后谎柄,就去處理其他的請(qǐng)求,當(dāng)IO調(diào)用返回后惯雳,會(huì)通知該工作進(jìn)程朝巫。
對(duì)于這樣的系統(tǒng)調(diào)用,主要使用Nginx服務(wù)器的事件驅(qū)動(dòng)模型來(lái)實(shí)現(xiàn)石景,如下圖所示:
如上圖所示劈猿,Nginx的事件驅(qū)動(dòng)模型由事件收集器拙吉、事件發(fā)送器和事件處理器三部分基本單元組成。
事件收集器:負(fù)責(zé)收集worker進(jìn)程的各種IO請(qǐng)求揪荣;
事件發(fā)送器:負(fù)責(zé)將IO事件發(fā)送到事件處理器筷黔;
事件處理器:負(fù)責(zé)各種事件的響應(yīng)工作。
事件發(fā)送器將每個(gè)請(qǐng)求放入一個(gè)待處理事件列表仗颈,使用非阻塞I/O方式調(diào)用事件處理器來(lái)處理該請(qǐng)求佛舱。
其處理方式稱為“多路IO復(fù)用方法”,常見(jiàn)的包括以下三種:select模型挨决、poll模型请祖、epoll模型。
5.Nginx進(jìn)程處理模型
Nginx服務(wù)器使用 master/worker 多進(jìn)程模式脖祈,多線程啟動(dòng)和執(zhí)行的流程如下:
主程序Masterprocess啟動(dòng)后损拢,通過(guò)一個(gè)for循環(huán)來(lái)接收和處理外部信號(hào)
主進(jìn)程通過(guò)fork()函數(shù)產(chǎn)生worker子進(jìn)程,每個(gè)子進(jìn)程執(zhí)行一個(gè)for循環(huán)來(lái)實(shí)現(xiàn)Nginx服務(wù)器對(duì)事件的接收和處理
一般推薦worker進(jìn)程數(shù)與CPU內(nèi)核數(shù)一致撒犀,這樣一來(lái)不存在大量的子進(jìn)程生成和管理任務(wù)福压,避免了進(jìn)程之間競(jìng)爭(zhēng)CPU資源和進(jìn)程切換的開(kāi)銷。
而且Nginx為了更好的利用多核特性或舞,提供了CPU親緣性的綁定選項(xiàng)荆姆,我們可以將某一個(gè)進(jìn)程綁定在某一個(gè)核上,這樣就不會(huì)因?yàn)檫M(jìn)程的切換帶來(lái)Cache的失效映凳。
對(duì)于每個(gè)請(qǐng)求胆筒,有且只有一個(gè)工作進(jìn)程對(duì)其處理。首先诈豌,每個(gè)worker進(jìn)程都是從master進(jìn)程fork過(guò)來(lái)仆救。在master進(jìn)程里面,先建立好需要listen的socket(listenfd)之后矫渔,然后再fork出多個(gè)worker進(jìn)程彤蔽。
所有worker進(jìn)程的listenfd會(huì)在新連接到來(lái)時(shí)變得可讀,為保證只有一個(gè)進(jìn)程處理該連接庙洼,所有worker進(jìn)程在注冊(cè)listenfd讀事件前搶占accept_mutex
搶到互斥鎖的那個(gè)進(jìn)程注冊(cè)listenfd讀事件顿痪,在讀事件里調(diào)用accept接受該連接。
當(dāng)一個(gè)worker進(jìn)程在accept這個(gè)連接之后油够,就開(kāi)始讀取請(qǐng)求蚁袭,解析請(qǐng)求,處理請(qǐng)求石咬,產(chǎn)生數(shù)據(jù)后揩悄,再返回給客戶端,最后才斷開(kāi)連接鬼悠,一個(gè)完整的請(qǐng)求就是這樣删性。
我們可以看到棉饶,一個(gè)請(qǐng)求,完全由worker進(jìn)程來(lái)處理镇匀,而且只在一個(gè)worker進(jìn)程中處理敬锐。
如下圖所示:
在Nginx服務(wù)器的運(yùn)行過(guò)程中另患,主進(jìn)程和工作進(jìn)程需要進(jìn)程交互。交互依賴于Socket實(shí)現(xiàn)的管道來(lái)實(shí)現(xiàn)极舔。
5.1.主進(jìn)程與工作進(jìn)程交互
這條管道與普通的管道不同群发,它是由主進(jìn)程指向工作進(jìn)程的單向管道晰韵,包含主進(jìn)程向工作進(jìn)程發(fā)出的指令工,作進(jìn)程ID等熟妓。同時(shí)主進(jìn)程與外界通過(guò)信號(hào)通信雪猪;每個(gè)子進(jìn)程具備接收信號(hào),并處理相應(yīng)的事件的能力起愈。
5.2.工作進(jìn)程與工作進(jìn)程交互
這種交互和主進(jìn)程-工作進(jìn)程交互基本一致只恨,但是會(huì)通過(guò)主進(jìn)程間接完成,工作進(jìn)程之間是相互隔離的抬虽。
所以當(dāng)工作進(jìn)程W1需要向工作進(jìn)程W2發(fā)指令時(shí)官觅,首先找到W2的進(jìn)程ID,然后將正確的指令寫(xiě)入指向W2的通道阐污,W2收到信號(hào)采取相應(yīng)的措施休涤。
Nginx實(shí)戰(zhàn)核心
Nginx?(engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)笛辟。Nginx是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的Rambler.ru站點(diǎn)(俄文:Рамблер)開(kāi)發(fā)的功氨,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。
其將源代碼以類BSD許可證的形式發(fā)布手幢,因它的穩(wěn)定性捷凄、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名围来。2011年6月1日纵势,nginx 1.0.4發(fā)布。
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器管钳,在BSD-like 協(xié)議下發(fā)行钦铁。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng)才漆,事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好牛曹,中國(guó)大陸使用nginx網(wǎng)站用戶有:百度、京東醇滥、新浪黎比、網(wǎng)易超营、騰訊、淘寶等阅虫。
第1章 Nginx簡(jiǎn)介
第2章 Nginx服務(wù)器的安裝與配置
第3章 Nginx的基本配置與優(yōu)化
第4章 Nginx與PHP(FastCGI)的安裝演闭、配置與優(yōu)化
第5章 Nginx與JSP、ASP.NET颓帝、Perl的安裝與配置
第6章 Nginx HTTP負(fù)載均衡和反向代理的配置與優(yōu)化
第7章 Nginx的Rewrite規(guī)則與實(shí)例
第8章 Nginx模塊開(kāi)發(fā)
第9章 Nginx的Web緩存服務(wù)與新浪網(wǎng)的開(kāi)源NCACHE模塊
第10章 Nginx在國(guó)內(nèi)知名網(wǎng)站中的應(yīng)用案例
第11章 Nginx的非典型應(yīng)用實(shí)例
第12章 Nginx的核心模塊
第13章 Nginx的標(biāo)準(zhǔn)HTTP模塊
第14章 Nginx的其他HTTP模塊
第15章 Nginx的郵件模塊
由于細(xì)節(jié)內(nèi)容實(shí)在太多啦米碰,所以只把部分知識(shí)點(diǎn)截圖出來(lái)粗略的介紹,每個(gè)小節(jié)點(diǎn)里面都有更細(xì)化的內(nèi)容购城!
幫忙轉(zhuǎn)發(fā)+關(guān)注然后私信我回復(fù)“Nginx”即可獲取Nginx實(shí)戰(zhàn)書(shū)籍電子版的免費(fèi)領(lǐng)取方式吕座。