Nginx 請求處理階段

Nginx 處理每一個用戶請求時仪吧,都是按照若干個不同階段(phase)依次處理的翘贮,而不是根據(jù)配置文件上的順序答捕。 Nginx 處理請求的過程一共劃分為 11 個階段时甚,按照執(zhí)行順序依次是: post-read、server-rewrite乞而、find-config送悔、rewrite、post-rewrite爪模、 preaccess放祟、access、post-access呻右、try-files、content鞋喇、log.

Nginx 處理請求的過程一共劃分為 11 個階段声滥,按照執(zhí)行順序依次是 post-read、server-rewrite侦香、find-config落塑、rewrite、post-rewrite罐韩、preaccess憾赁、access、post-access散吵、try-files龙考、content 以及 log。

1矾睦、post-read

最先執(zhí)行的 post-read 階段在 Nginx 讀取并解析完請求頭(request headers)之后就立即開始運(yùn)行晦款。例如:使用了 ngx_realip 模塊提供的 set_real_ip_fromreal_ip_header 這兩條配置指令

2、server-rewrite

由于 server-rewrite 階段位于 post-read 階段之后枚冗,所以 server 配置塊中的 set 指令也就總是運(yùn)行在 ngx_realip 模塊改寫請求的來源地址之后缓溅。

3、find-config

這個階段并不支持 Nginx 模塊注冊處理程序赁温,而是由 Nginx 核心來完成當(dāng)前請求與 location 配置塊之間的配對工作坛怪。換句話說,在此階段之前股囊,請求并沒有與任何 location 配置塊相關(guān)聯(lián)袜匿。因此,對于運(yùn)行在 find-config 階段之前的 post-read 和 server-rewrite 階段來說毁涉,只有 server 配置塊以及更外層作用域中的配置指令才會起作用沉帮。這就是為什么只有寫在 server 配置塊中的 ngx_rewrite 模塊的指令才會運(yùn)行在 server-rewrite 階段,這也是為什么前面所有例子中的 ngx_realip 模塊的指令也都特意寫在了 server 配置塊中,以確保其注冊在 post-read 階段的處理程序能夠生效穆壕。

4待牵、rewrite

由于 Nginx 已經(jīng)在 find-config 階段完成了當(dāng)前請求與 location 的配對,所以從 rewrite 階段開始喇勋,location 配置塊中的指令便可以產(chǎn)生作用缨该。當(dāng) ngx_rewrite 模塊的指令用于 location 塊中時,便是運(yùn)行在這個 rewrite 階段川背。

5贰拿、post-rewrite

這個階段也像 find-config 階段那樣不接受 Nginx 模塊注冊處理程序,而是由 Nginx 核心完成 rewrite 階段所要求的“內(nèi)部跳轉(zhuǎn)”操作(如果 rewrite 階段有此要求的話)熄云。例如:通過 rewrite 指令把當(dāng)前請求的 URI 無條件地改寫為 /bar膨更,同時發(fā)起一個“內(nèi)部跳轉(zhuǎn)”,最終跳進(jìn)了 location /bar 中缴允。這里比較有趣的地方是“內(nèi)部跳轉(zhuǎn)”的工作原理荚守。“內(nèi)部跳轉(zhuǎn)”本質(zhì)上其實就是把當(dāng)前的請求處理階段強(qiáng)行倒退到 find-config 階段练般,以便重新進(jìn)行請求 URI 與 location 配置塊的配對矗漾。

6、preaccess

該階段在 access 階段之前執(zhí)行薄料,故名 preaccess.標(biāo)準(zhǔn)模塊 ngx_limit_reqngx_limit_zone 就運(yùn)行在此階段敞贡,前者可以控制請求的訪問頻度,而后者可以限制訪問的并發(fā)度摄职。

7誊役、access

標(biāo)準(zhǔn)模塊 ngx_access、第三方模塊 ngx_auth_request 以及第三方模塊 ngx_luaaccess_by_lua 指令就運(yùn)行在這個階段琳钉。

8势木、 post-access

這個階段也和 post-rewrite 階段類似,并不支持 Nginx 模塊注冊處理程序歌懒,而是由 Nginx 核心自己完成一些處理工作啦桌。post-access 階段主要用于配合 access 階段實現(xiàn)標(biāo)準(zhǔn) ngx_http_core 模塊提供的配置指令 satisfy 的功能。對于多個 Nginx 模塊注冊在 access 階段的處理程序及皂, satisfy 配置指令可以用于控制它們彼此之間的協(xié)作方式甫男。比如模塊 A 和 B 都在 access 階段注冊了與訪問控制相關(guān)的處理程序,那就有兩種協(xié)作方式验烧,一是模塊 A 和模塊 B 都得通過驗證才算通過板驳,二是模塊 A 和模塊 B 只要其中任一個通過驗證就算通過。第一種協(xié)作方式稱為 all 方式(或者說“與關(guān)系”)碍拆,第二種方式則被稱為 any 方式(或者說“或關(guān)系”)若治。默認(rèn)情況下慨蓝,Nginx 使用的是 all 方式。

9端幼、try-files

這個階段專門用于實現(xiàn)標(biāo)準(zhǔn)配置指令 try_files 的功能礼烈,并不支持 Nginx 模塊注冊處理程序。try_files 指令接受兩個以上任意數(shù)量的參數(shù)婆跑,每個參數(shù)都指定了一個 URI. 這里假設(shè)配置了 N 個參數(shù)此熬,則 Nginx 會在 try-files 階段,依次把前 N-1 個參數(shù)映射為文件系統(tǒng)上的對象(文件或者目錄)滑进,然后檢查這些對象是否存在犀忱。一旦 Nginx 發(fā)現(xiàn)某個文件系統(tǒng)對象存在,就會在 try-files 階段把當(dāng)前請求的 URI 改寫為該對象所對應(yīng)的參數(shù) URI(但不會包含末尾的斜杠字符扶关,也不會發(fā)生 “內(nèi)部跳轉(zhuǎn)”)阴汇。如果前 N-1 個參數(shù)所對應(yīng)的文件系統(tǒng)對象都不存在,try-files 階段就會立即發(fā)起“內(nèi)部跳轉(zhuǎn)”到最后一個參數(shù)(即第 N 個參數(shù))所指定的 URI.通過 root 配置指令所指定的“文檔根目錄”進(jìn)行映射节槐。例如,當(dāng)“文檔根目錄”是 /var/www/ 的時候疯淫,請求 URI /foo/bar 會被映射為文件 /var/www/foo/bar戳玫,而請求 URI /foo/baz/ 則會被映射為目錄 /var/www/foo/baz/. 注意這里是如何通過 URI 末尾的斜杠字符是否存在來區(qū)分“目錄”和“文件”的熙掺。

10咕宿、content

Nginx 的 content 階段是所有請求處理階段中最為重要的一個币绩,因為運(yùn)行在這個階段的配置指令一般都肩負(fù)著生成“內(nèi)容”(content)并輸出 HTTP 響應(yīng)的使命。正因為其重要性府阀,這個階段的配置指令也異常豐富缆镣。echo、 Nginx 變量漫談(二) 中接觸到的 echo_exec 指令董瞻, Nginx 變量漫談(三) 中接觸到的 proxy_pass 指令,Nginx 變量漫談(五) 中介紹過的 echo_location 指令田巴,以及 Nginx 變量漫談(七) 中介紹過的 content_by_lua

11壹哺、log

log階段處理抄伍,比如記錄訪問量/統(tǒng)計平均響應(yīng)時間。log_by_lua

轉(zhuǎn)載地址
轉(zhuǎn)載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末管宵,一起剝皮案震驚了整個濱河市截珍,隨后出現(xiàn)的幾起案子攀甚,更是在濱河造成了極大的恐慌岗喉,老刑警劉巖秋度,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沈堡,死亡現(xiàn)場離奇詭異,居然都是意外死亡诞丽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門僧免,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懂衩,你說我怎么就攤上這事撞叨∽嵌矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵法希,是天一觀的道長。 經(jīng)常有香客問我苫亦,道長,這世上最難降的妖魔是什么屋剑? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮唉匾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巍膘。我一直安慰自己,他們只是感情好典徘,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帜平,像睡著了一般幽告。 火紅的嫁衣襯著肌膚如雪裆甩。 梳的紋絲不亂的頭發(fā)上冗锁,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天嗤栓,我揣著相機(jī)與錄音冻河,去河邊找鬼茉帅。 笑死叨叙,一個胖子當(dāng)著我的面吹牛堪澎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播樱蛤,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昨凡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起便脊,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎就轧,沒想到半個月后田度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡镇饺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奸笤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡边灭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绒瘦,到底是詐尸還是另有隱情称簿,我是刑警寧澤惰帽,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站该酗,受9級特大地震影響授药,放射性物質(zhì)發(fā)生泄漏呜魄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一耕赘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧操骡,春花似錦、人聲如沸册招。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至键痛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間絮短,已是汗流浹背江兢。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工丁频, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人席里。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像奖磁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咖为,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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