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