nginx如何處理http請求

nginx處理http的請求是nginx最重要的職能,也是最復雜的一部分。可以大概說下執行流程:

nginx如何處理http請求

請求頭讀取;

解析請求行;

解析請求頭;

讀取請求體;

開始最重要的部分,即多階段處理; nginx把請求處理劃分成了11個階段,也就是說當nginx讀取了請求行和請求頭之后,將請求封裝了結構體ngx_http_request_t,然后每個階段的handler都會根據這個ngx_http_request_t,對請求進行處理,例如重寫uri,權限控制,路徑查找,生成內容以及記錄日志等等;

將結果返回給客戶端;

ngx_http_process_request_line函數的主要作用即是解析請求行,同樣由于涉及到網絡IO操作,即使是很短的一行請求行可能也不能被一次讀完,所以在之前的ngx_http_init_request函數中,ngx_http_process_request_line函數被設置為讀事件的處理函數,它也只擁有一個唯一的ngx_event_t *類型參數,并且在函數的開頭,同樣需要判斷是否是超時事件,如果是的話,則關閉這個請求和連接;否則開始正常的解析流程。先調用ngx_http_read_request_header函數讀取數據。

多階段處理是nginx模塊最重要的部分,因為第三方模塊也是注冊在這;

例如有人寫了一個利用nginx和memcache做頁面緩存的第三方模塊,也可以把memcache換成redis集群等等;

而且nginx多階段處理有點類似python和golang web框架的中間件,后者主要是用裝飾器模式,對handler一層一層封裝,而nginx是用數組(鏈表)形式組合多階段handler,然后按handler鏈表執行即可;

客戶端發送過的統一資源定位符(url)對應服務器上某一路徑上的資源,web服務器需要做的僅僅是將url映射到本地文件系統的路徑,然后讀取相應文件并返回給客戶端。但這僅僅是最初的互聯網的需求,而如今互聯網出現了各種各樣復雜的需求,要求web服務器能夠處理諸如安全及權限控制,多媒體內容和動態網頁等等問題。這些復雜的需求導致web服務器不再是一個短小的程序,而變成了一個必須經過仔細設計,模塊化的系統。

nginx良好的模塊化特性體現在其對請求處理流程的多階段劃分當中,多階段處理流程就好像一條流水線,一個nginx進程可以并發的處理處于不同階段的多個請求。nginx允許開發者在處理流程的任意階段注冊模塊,在啟動階段,nginx會把各個階段注冊的所有模塊處理函數按序的組織成一條執行鏈。

更多Nginx相關技術文章,請訪問Nginx使用教程欄目進行學習!

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享