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服務器架構示意圖](http://img4.imgtn.bdimg.com/it/u=3363010400,1823653033&fm=214&gp=0.jpg)
在該示意圖中奸腺,有幾個方面的內(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)機制阔挠,交互的準備工作都是在工作進程生成時完成的。
- Master-Worker交互
工作進程是由主進程生成的(使用了fork函數(shù)).Nginx服務器啟動以后船逮,主進程根據(jù)配置文件決定生成的工作進程的數(shù)量思币,然后建立一張全局的工作進程表用于存放當前未退出的所有工作進程鹿响。
在主進程生成工作進程后,將新生成的工作進程加入到工作進程表中谷饿,并建立一個單向管道并將其傳遞給該工作進程惶我。該管道與普通的管道不同,它是由主進程指向工作進程的單向管道博投,包含了主進程向工作進程發(fā)出的指令绸贡、工作進程ID、工作進程在工作進程表中的索引和必要的文件描述符等信息。
主進程與外界通過信號機制進行通信听怕,當接收到需要處理的信號時捧挺,它通過管道向相關的工作進程發(fā)送正確的指令。每個工作進程都有能力捕獲管道中可讀事件尿瞭,當管道中有可讀事件時闽烙,工作進程從管道讀取并解析指令,然后采用響應的措施声搁。這樣就完成了Master-Worker的交互黑竞。 - 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)中最為復雜的部分累榜,包含了對輸入事件繁雜的響應和處理過程,并且這些處理過程都是基于異步任務處理的灵嫌。