[code.nginx] Nginx設計架構

Nginx服務器架構

Nginx服務器啟動后婴削,產(chǎn)生一個主進程(master process),主進程執(zhí)行一系列工作后產(chǎn)生一個或者多個工作進程(worker processes)牙肝。主進程主要進行Nginx配置文件解析唉俗、數(shù)據(jù)結構初始化、模塊配置和注冊配椭、信號處理虫溜、網(wǎng)絡監(jiān)聽生成、工作進程主要進行進程初始化股缸、模塊調用和請求處理等工作衡楞,是Nginx服務器提供服務的主體。

在客戶端請求動態(tài)站點的過程中敦姻,Nginx服務器還涉及和后端服務器的通信瘾境。Nginx服務器還涉及和后端服務器的通信。Nginx服務器將接收到的Web請求通過代理轉發(fā)到后端服務器镰惦,由后端服務器進行數(shù)據(jù)處理和頁面組織迷守,然后將結果返回。
另外旺入,Nginx服務器為了提高對請求的響應效率兑凿,進一步降低網(wǎng)絡壓力,采用了緩存機制眨业,將歷史應答數(shù)據(jù)緩存到本地急膀。在每次Nginx服務器啟動后的一段時間內(nèi),會啟動專門的進程對本地緩存的內(nèi)容重建索引龄捡,保證對緩存文件的快速訪問卓嫂。
根據(jù)上面的分析,我們可以將Nginx服務器的結構大致分為主進程聘殖、工作進程晨雳、后端服務器和緩存等部分。
下圖中展示了各個部分之間的聯(lián)系和交互:


Nginx服務器架構示意圖
Nginx服務器架構示意圖

在該示意圖中奸腺,有幾個方面的內(nèi)容需要重點闡述餐禁,包括Nginx服務器的進程、進程交互和Run-Loop時間處理循環(huán)機制等突照。

Nginx服務器的進程

到目前為止帮非,我們一共提到Nginx服務器的三大類進程:一類是主進程,另一類是由主進程生成的工作進程,還有剛才提到的用于為緩存文件建立索引的進程末盔。
1.主進程(Master Process)
Nginx服務器啟動時運行的主要進程筑舅。它的主要功能是與外界通信和對內(nèi)部其他進程進行管理,具體來說有以下幾點:

  • 讀取Nginx配置文件并驗證其有效性和正確性陨舱。
  • 建立翠拣、綁定和關閉Socket。
  • 按照配置生成游盲、管理和結束工作進程误墓。
  • 接收外界指令,比如重啟益缎、升級及退出服務器等指令谜慌。
  • 不中斷服務,實現(xiàn)平滑重啟链峭,應用新配置畦娄。
  • 不中斷服務,實現(xiàn)平滑升級弊仪,升級失敗進行回滾處理。
  • 開啟日志文件杖刷,獲取文件描述符励饵。
  • 編譯和處理Perl腳本。

2.工作進程(Worker Process)
由主進程生成滑燃,生成數(shù)量可以通過Nginx配置文件指定役听,正常情況下生存于主進程的整個生命周期。該進程的主要工作有以下幾項:

  • 接受客戶端請求表窘。
  • 將請求一次送入各個功能模塊進行過濾處理典予。
  • IO調用,獲取響應數(shù)據(jù)乐严。
  • 與后端服務器通信瘤袖,接收后端服務器處理結果。
  • 數(shù)據(jù)緩存昂验,訪問緩存索引捂敌、查詢和調用緩存數(shù)據(jù)。
  • 發(fā)送請求結果既琴,響應客戶端請求占婉。
  • 接收主程序指令,比如重啟甫恩、升級和退出等指令逆济。

工作進程完成的工作還有很多,我們在這里列出了主要的幾項。從這些工作中可以看到奖慌,該進程是Nginx服務器提供Web服務抛虫、處理客戶端請求的主要進程,完成了Nginx服務器的主題工作升薯。因此莱褒,在實際使用中,作為服務器管理者涎劈,我們應該重點監(jiān)視工作進程的運行狀態(tài)广凸,保證Nginx服務器對外提供穩(wěn)定的Web服務。

3.緩存索引重建及管理進程(Cache Loader & Cache Manager)
Cache模塊蛛枚,主要由緩存索引重建(Cache Loader)和緩存索引管理(Cache Manager)兩類進程完成工作谅海。緩存索引重建進程是在Nginx服務啟動一段時間后(默認是1分鐘)由主進程生成,在緩存元數(shù)據(jù)重建完成后就自動退出蹦浦。緩存索引管理進程一般存在于主進程的整個生命周期扭吁,負責對緩存索引進行管理。
緩存索引重建進程完成的主要工作是盲镶,根據(jù)本地磁盤上的緩存文件在內(nèi)存中建立索引元數(shù)據(jù)庫侥袜。該進程啟動后,對本地磁盤上存放緩存文件的目錄結構進行掃描溉贿,檢查內(nèi)存中已有的緩存元數(shù)據(jù)是否正確枫吧,并更新索引元數(shù)據(jù)庫。
緩存索引管理進程主要負責在索引元數(shù)據(jù)更新完成后宇色,對元數(shù)據(jù)是否過期做出判斷九杂。
這兩個進程維護的內(nèi)存索引元數(shù)據(jù)庫,為工作進程對緩存數(shù)據(jù)的快速查詢提供了便利宣蠕。

進程交互

Nginx服務器在使用Master-Worker模型時例隆,會涉及主進程與工作進程(Master-Worker)之間的交互和工作進程(Worker-Worker)之間的交互库继。這兩類交互都依賴于管道(channel)機制阔挠,交互的準備工作都是在工作進程生成時完成的。

  1. Master-Worker交互
    工作進程是由主進程生成的(使用了fork函數(shù)).Nginx服務器啟動以后船逮,主進程根據(jù)配置文件決定生成的工作進程的數(shù)量思币,然后建立一張全局的工作進程表用于存放當前未退出的所有工作進程鹿响。
    在主進程生成工作進程后,將新生成的工作進程加入到工作進程表中谷饿,并建立一個單向管道并將其傳遞給該工作進程惶我。該管道與普通的管道不同,它是由主進程指向工作進程的單向管道博投,包含了主進程向工作進程發(fā)出的指令绸贡、工作進程ID、工作進程在工作進程表中的索引和必要的文件描述符等信息。
    主進程與外界通過信號機制進行通信听怕,當接收到需要處理的信號時捧挺,它通過管道向相關的工作進程發(fā)送正確的指令。每個工作進程都有能力捕獲管道中可讀事件尿瞭,當管道中有可讀事件時闽烙,工作進程從管道讀取并解析指令,然后采用響應的措施声搁。這樣就完成了Master-Worker的交互黑竞。
  2. Worker-Worker交互
    Worker-Worker交互在實現(xiàn)原理上和Master-Worker交互基本是一樣的。主要工作進程之間能夠得到彼此的信息疏旨,建立管道很魂,即可通信。由于工作進程之間是相互隔離的檐涝,因此一個進程要想知道另一個進程的信息遏匆,只能通過主進程來設置了。
    為了達到工作進程之間交互的目的谁榜,主進程在生成工作進程后幅聘,在工作進程表中進行遍歷,將該新進程的ID以及針對該進程建立的管道句柄傳遞給工作進程表中的其他進程窃植,為工作進程之間的交互做準備喊暖。每個工作進程捕獲管道中可讀事件,根據(jù)指令采取相應的措施撕瞧。這樣就完成了Worker-Worker交互。

Run Loops事件處理循環(huán)模型

Run Loops狞尔,指的是進程內(nèi)部用來不停的調配工作丛版,對事件進行循環(huán)處理的一種模型。它屬于進程或者線程的基礎架構部分偏序。該模型對事件的處理不是自動的页畦,需要在設計代碼過程中,在適當?shù)臅r候啟動Run-Loop機制對輸入的事件作出響應研儒。
該模型是一個集合豫缨,集合中的每一個元素稱為一個Run-Loop。每個Run-Loop可運行在不同的模式下端朵,其中可以包含它所監(jiān)聽的輸入事件源好芭、定時器以及在事件發(fā)生時需要通知的Run-Loop監(jiān)聽器(Run-Loop Observers)。為了監(jiān)聽特定的事件冲呢,可以在Run Loops中添加響應的Run-Loop監(jiān)聽器舍败。當被監(jiān)聽的事件發(fā)生時,Run-Loop會產(chǎn)生一個消息,被Run-Loop監(jiān)聽器捕獲邻薯,從而執(zhí)行預定的動作裙戏。
Nginx服務器在工作進程中實現(xiàn)了Run-Loop事件處理循環(huán)模型的使用,用來處理客戶端發(fā)來的請求事件厕诡。該部分的實現(xiàn)可以說是Nginx服務器程序實現(xiàn)中最為復雜的部分累榜,包含了對輸入事件繁雜的響應和處理過程,并且這些處理過程都是基于異步任務處理的灵嫌。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壹罚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子醒第,更是在濱河造成了極大的恐慌渔嚷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠曼,死亡現(xiàn)場離奇詭異形病,居然都是意外死亡,警方通過查閱死者的電腦和手機霞幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門漠吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人司恳,你說我怎么就攤上這事途乃。” “怎么了扔傅?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵耍共,是天一觀的道長。 經(jīng)常有香客問我猎塞,道長试读,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任荠耽,我火速辦了婚禮钩骇,結果婚禮上,老公的妹妹穿的比我還像新娘铝量。我一直安慰自己倘屹,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布慢叨。 她就那樣靜靜地躺著纽匙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪插爹。 梳的紋絲不亂的頭發(fā)上哄辣,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天请梢,我揣著相機與錄音,去河邊找鬼力穗。 笑死毅弧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的当窗。 我是一名探鬼主播够坐,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崖面!你這毒婦竟也來了元咙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巫员,失蹤者是張志新(化名)和其女友劉穎庶香,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體简识,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赶掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了七扰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢赂。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颈走,靈堂內(nèi)的尸體忽然破棺而出膳灶,到底是詐尸還是另有隱情,我是刑警寧澤立由,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布轧钓,位于F島的核電站,受9級特大地震影響锐膜,放射性物質發(fā)生泄漏聋迎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一枣耀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庭再,春花似錦捞奕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恨搓,卻和暖如春院促,著一層夾襖步出監(jiān)牢的瞬間筏养,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工常拓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渐溶,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓弄抬,卻偏偏與公主長得像茎辐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掂恕,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx拖陆?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,672評論 24 1,002
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成懊亡,其中依啰,內(nèi)核的設計非常微小和簡潔,完成的工作也非常簡單...
    rosekissyou閱讀 10,214評論 5 124
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理店枣,服務發(fā)現(xiàn)速警,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》艰争,我們講述了瀏覽器端請求發(fā)起過程坏瞄,通過DNS域名解析服務器IP,并建...
    七寸知架構閱讀 81,002評論 21 356
  • 人經(jīng)常有惰性甩卓。比如我堅持了差不多快15天的鸠匀,習慣性的10點半起床,看書做筆記逾柿,下午3點睡會缀棍,5點去店里。這兩天有些...
    曾曾的麻麻閱讀 210評論 0 0