Nginx 使用一個多進(jìn)程模型來對外提供服務(wù),其中一個 master 進(jìn)程,多個 worker 進(jìn)程。master 進(jìn)程負(fù)責(zé)管理 Nginx 本身和其他 worker 進(jìn)程。
所有實際上的業(yè)務(wù)處理邏輯都在 worker 進(jìn)程。worker 進(jìn)程中有一個函數(shù),執(zhí)行無限循環(huán),不斷處理收到的來自客戶端的請求,并進(jìn)行處理,直到整個 Nginx 服務(wù)被停止。
worker 進(jìn)程中,ngx_worker_process_cycle()函數(shù)就是這個無限循環(huán)的處理函數(shù)。在這個函數(shù)中,一個請求的簡單處理流程如下:
為了讓大家更好的了解 Nginx 中請求處理過程,我們以 HTTP Request 為例,來做一下詳細(xì)地說明。
從 Nginx 的內(nèi)部來看,一個 HTTP Request 的處理過程涉及到以下幾個階段。
在這里,我們需要了解一下 phase handler 這個概念。phase 字面的意思,就是階段。所以 phase handlers 也就好理解了,就是包含若干個處理階段的一些 handler。
在每一個階段,包含有若干個 handler,再處理到某個階段的時候,依次調(diào)用該階段的 handler 對 HTTP Request 進(jìn)行處理。
通常情況下,一個 phase handler 對這個 request 進(jìn)行處理,并產(chǎn)生一些輸出。通常 phase handler 是與定義在配置文件中的某個 location 相關(guān)聯(lián)的。
一個 phase handler 通常執(zhí)行以下幾項任務(wù):
當(dāng) Nginx 讀取到一個 HTTP Request 的 header 的時候,Nginx 首先查找與這個請求關(guān)聯(lián)的虛擬主機(jī)的配置。如果找到了這個虛擬主機(jī)的配置,那么通常情況下,這個 HTTP Request 將會經(jīng)過以下幾個階段的處理(phase handlers):
在內(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 依次嘗試:
.gz
文件存在,有的話,就發(fā)送這個給客戶端(客戶端支持 gzip 的情況下)。內(nèi)容產(chǎn)生階段完成以后,生成的輸出會被傳遞到 filter 模塊去進(jìn)行處理。filter 模塊也是與 location 相關(guān)的。所有的 fiter 模塊都被組織成一條鏈。輸出會依次穿越所有的 filter,直到有一個 filter 模塊的返回值表明已經(jīng)處理完成。
這里列舉幾個常見的 filter 模塊,例如:
在所有的 filter 中,有幾個 filter 模塊需要關(guān)注一下。按照調(diào)用的順序依次說明如下: