NGINX的模塊化

nginx的內(nèi)部結(jié)構(gòu)是由核心部分和一系列的功能模塊所組成莱衩。這樣劃分是為了使得每個模塊的功能相對簡單毡庆,便于開發(fā)吃媒,同時也便于對系統(tǒng)進行功能擴展。為了便于描述爹袁,下文中我們將使用nginx core來稱呼nginx的核心功能部分远荠。
nginx提供了web服務(wù)器的基礎(chǔ)功能,同時提供了web服務(wù)反向代理失息,email服務(wù)反向代理功能譬淳。nginx core實現(xiàn)了底層的通訊協(xié)議,為其他模塊和nginx進程構(gòu)建了基本的運行時環(huán)境盹兢,并且構(gòu)建了其他各模塊的協(xié)作基礎(chǔ)瘦赫。除此之外,或者說大部分與協(xié)議相關(guān)的蛤迎,或者應(yīng)用相關(guān)的功能都是在這些模塊中所實現(xiàn)的确虱。我們的RTMP服務(wù)同樣以模塊的形式實現(xiàn)。

模塊概述

nginx將各功能模塊組織成一條鏈替裆,當有請求到達的時候校辩,請求依次經(jīng)過這條鏈上的部分或者全部模塊,進行處理辆童。每個模塊實現(xiàn)特定的功能宜咒。例如,實現(xiàn)對請求解壓縮的模塊把鉴,實現(xiàn)SSI的模塊故黑,實現(xiàn)與上游服務(wù)器進行通訊的模塊,實現(xiàn)與FastCGI服務(wù)進行通訊的模塊庭砍。
有兩個模塊比較特殊场晶,他們居于nginx core和各功能模塊的中間。這兩個模塊就是http模塊和mail模塊怠缸。這2個模塊在nginx core之上實現(xiàn)了另外一層抽象诗轻,處理與HTTP協(xié)議和email相關(guān)協(xié)議(SMTP/POP3/IMAP)有關(guān)的事件,并且確保這些事件能被以正確的順序調(diào)用其他的一些功能模塊揭北。
目前HTTP協(xié)議是被實現(xiàn)在http模塊中的扳炬,但是有可能將來被剝離到一個單獨的模塊中吏颖,以擴展nginx支持SPDY協(xié)議。

模塊的分類

nginx的模塊根據(jù)其功能基本上可以分為以下幾種類型:

  • event module:
    搭建了獨立于操作系統(tǒng)的事件處理機制的框架恨樟,及提供了各具體事件的處理半醉。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等劝术。nginx具體使用何種事件處理模塊奉呛,這依賴于具體的操作系統(tǒng)和編譯選項。
  • phase handler:
    此類型的模塊也被直接稱為handler模塊夯尽。主要負責處理客戶端請求并產(chǎn)生待響應(yīng)內(nèi)容瞧壮,比如ngx_http_static_module模塊,負責客戶端的靜態(tài)頁面請求處理并將對應(yīng)的磁盤文件準備為響應(yīng)內(nèi)容輸出匙握。
  • output filter:
    也稱為filter模塊咆槽,主要是負責對輸出的內(nèi)容進行處理,可以對輸出進行修改圈纺。例如秦忿,可以實現(xiàn)對輸出的所有html頁面增加預(yù)定義的footbar一類的工作,或者對輸出的圖片的URL進行替換之類的工作蛾娶。
  • upstream:
    upstream模塊實現(xiàn)反向代理的功能灯谣,將真正的請求轉(zhuǎn)發(fā)到后端服務(wù)器上,并從后端服務(wù)器上讀取響應(yīng)蛔琅,發(fā)回客戶端胎许。upstream模塊是一種特殊的handler,只不過響應(yīng)內(nèi)容不是真正由自己產(chǎn)生的罗售,而是從后端服務(wù)器上讀取的辜窑。
  • load-balancer:
    負載均衡模塊,實現(xiàn)特定的算法寨躁,在眾多的后端服務(wù)器中穆碎,選擇一個服務(wù)器出來作為某個請求的轉(zhuǎn)發(fā)服務(wù)器。

請求的處理流程

為了讓大家更好的了解nginx中請求處理過程职恳,我們以HTTP Request為例所禀,來做一下詳細地說明。
從nginx的內(nèi)部來看放钦,一個HTTP Request的處理過程涉及到以下幾個階段色徘。

  1. 初始化HTTP Request(讀取來自客戶端的數(shù)據(jù),生成HTTP Request對象最筒,該對象含有該請求所有的信息)贺氓。
  2. 處理請求頭。
  3. 處理請求體床蜘。
  4. 如果有的話辙培,調(diào)用與此請求(URL或者Location)關(guān)聯(lián)的handler。
  5. 依次調(diào)用各phase handler進行處理邢锯。
    在這里扬蕊,我們需要了解一下phase handler這個概念。phase字面的意思丹擎,就是階段尾抑。所以phase handlers也就好理解了,就是包含若干個處理階段的一些handler蒂培。
    在每一個階段再愈,包含有若干個handler,再處理到某個階段的時候护戳,依次調(diào)用該階段的handler對HTTP Request進行處理翎冲。
    通常情況下,一個phase handler對這個request進行處理媳荒,并產(chǎn)生一些輸出抗悍。通常phase handler是與定義在配置文件中的某個location相關(guān)聯(lián)的。

一個phase handler通常執(zhí)行以下幾項任務(wù):

  1. 獲取location配置钳枕。
  2. 產(chǎn)生適當?shù)捻憫?yīng)缴渊。
  3. 發(fā)送response header。
  4. 發(fā)送response body鱼炒。

當nginx讀取到一個HTTP Request的header的時候衔沼,nginx首先查找與這個請求關(guān)聯(lián)的虛擬主機的配置。如果找到了這個虛擬主機的配置昔瞧,那么通常情況下俐巴,這個HTTP Request將會經(jīng)過以下幾個階段的處理(phase handlers):

  1. NGX_HTTP_POST_READ_PHASE: 讀取請求內(nèi)容階段
  2. NGX_HTTP_SERVER_REWRITE_PHASE: Server請求地址重寫階段
  3. NGX_HTTP_FIND_CONFIG_PHASE: 配置查找階段:
  4. NGX_HTTP_REWRITE_PHASE: Location請求地址重寫階段
  5. NGX_HTTP_POST_REWRITE_PHASE: 請求地址重寫提交階段
  6. NGX_HTTP_PREACCESS_PHASE: 訪問權(quán)限檢查準備階段
  7. NGX_HTTP_ACCESS_PHASE: 訪問權(quán)限檢查階段
  8. NGX_HTTP_POST_ACCESS_PHASE: 訪問權(quán)限檢查提交階段
  9. NGX_HTTP_TRY_FILES_PHASE: 配置項try_files處理階段
  10. NGX_HTTP_CONTENT_PHASE:內(nèi)容產(chǎn)生階段
  11. NGX_HTTP_LOG_PHASE: 日志模塊處理階段
    在內(nèi)容產(chǎn)生階段,為了給一個request產(chǎn)生正確的響應(yīng)硬爆,nginx必須把這個request交給一個合適的content handler去處理欣舵。如果這個request對應(yīng)的location在配置文件中被明確指定了一個content handler,那么nginx就可以通過對location的匹配缀磕,直接找到這個對應(yīng)的handler缘圈,并把這個request交給這個content handler去處理。這樣的配置指令包括像袜蚕,perl糟把,flv,proxy_pass牲剃,mp4等遣疯。

如果一個request對應(yīng)的location并沒有直接有配置的content handler,那么nginx依次嘗試:

  1. 如果一個location里面有配置 random_index on凿傅,那么隨機選擇一個文件缠犀,發(fā)送給客戶端数苫。
  2. 如果一個location里面有配置 index指令,那么發(fā)送index指令指明的文件辨液,給客戶端虐急。
  3. 如果一個location里面有配置 autoindex on,那么就發(fā)送請求地址對應(yīng)的服務(wù)端路徑下的文件列表給客戶端滔迈。
  4. 如果這個request對應(yīng)的location上有設(shè)置gzip_static on止吁,那么就查找是否有對應(yīng)的.gz文件存在,有的話燎悍,就發(fā)送這個給客戶端(客戶端支持gzip的情況下)敬惦。
  5. 請求的URI如果對應(yīng)一個靜態(tài)文件,static module就發(fā)送靜態(tài)文件的內(nèi)容到客戶端谈山。

內(nèi)容產(chǎn)生階段完成以后俄删,生成的輸出會被傳遞到filter模塊去進行處理。filter模塊也是與location相關(guān)的勾哩。所有的fiter模塊都被組織成一條鏈抗蠢。輸出會依次穿越所有的filter,直到有一個filter模塊的返回值表明已經(jīng)處理完成思劳。
這里列舉幾個常見的filter模塊迅矛,例如:

  1. server-side includes。
  2. XSLT filtering潜叛。
  3. 圖像縮放之類的秽褒。
  4. gzip壓縮。

在所有的filter中威兜,有幾個filter模塊需要關(guān)注一下销斟。按照調(diào)用的順序依次說明如下:

  1. write:寫輸出到客戶端,實際上是寫到連接對應(yīng)的socket上椒舵。
  2. postpone:這個filter是負責subrequest的蚂踊,也就是子請求的。
  3. copy:將一些需要復(fù)制的buf(文件或者內(nèi)存)重新復(fù)制一份然后交給剩余的body filter處理笔宿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犁钟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泼橘,更是在濱河造成了極大的恐慌涝动,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炬灭,死亡現(xiàn)場離奇詭異醋粟,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門米愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厦凤,“玉大人,你說我怎么就攤上這事吗货∮具耄” “怎么了狈网?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵宙搬,是天一觀的道長。 經(jīng)常有香客問我拓哺,道長勇垛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任士鸥,我火速辦了婚禮闲孤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烤礁。我一直安慰自己讼积,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布脚仔。 她就那樣靜靜地躺著勤众,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤脏。 梳的紋絲不亂的頭發(fā)上们颜,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音猎醇,去河邊找鬼窥突。 笑死,一個胖子當著我的面吹牛硫嘶,可吹牛的內(nèi)容都是我干的阻问。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼沦疾,長吁一口氣:“原來是場噩夢啊……” “哼称近!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曹鸠,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤煌茬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彻桃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏予,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年扶欣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剔交。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖改衩,靈堂內(nèi)的尸體忽然破棺而出岖常,到底是詐尸還是另有隱情,我是刑警寧澤葫督,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布竭鞍,位于F島的核電站,受9級特大地震影響橄镜,放射性物質(zhì)發(fā)生泄漏偎快。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一洽胶、第九天 我趴在偏房一處隱蔽的房頂上張望晒夹。 院中可真熱鬧,春花似錦姊氓、人聲如沸丐怯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读跷。三九已至,卻和暖如春棕孙,著一層夾襖步出監(jiān)牢的瞬間舔亭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工蟀俊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钦铺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓肢预,卻偏偏與公主長得像矛洞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烫映,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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