Nginx源碼初探之HTTP模塊 -HTTP框架處理階段

      Nginx模塊化設計使得每個HTTP模塊都可以專注於完成一個獨立的、簡單的功能,而一個請求的完整處理過程可以由無數個HTTP模塊共同完成。依照常規的HTTP處理流程,Nginx將這些HTTP模塊分爲11個處理階段,對於這11個處理階段,其中有4個是必須有HTTP框架完成的,其他的7個是可以有HTTP模塊協同完成。理解這11個階段有助於理解HTTP框架對HTTP請求的處理。, 並不是說一個用戶請求最多隻能經過11個HTTP模塊提供的ngx_http_handler_pt方法來處理, NGX_HTTP_POST_READ_PHASE、NGX_HTTP_SERVER_REWRITE_PHASE、 NGX_HTTP_REWRITE_PHASE、NGX_HTTP_PREACCESS_PHASE、 NGX_HTTP_ACCESS_PHASE、NGX_HTTP_CONTENT_PHASE,NGX_HTTP_LOG_PHASE這7個階段可以包括任意多個處理方法,它們是可以同時作用於同一個用戶請求的。 而NGX_HTTP_FIND_CONFIG_PHASE、 NGX_HTTP_POST_REWRITE_PHASE、NGX_HTTP_POST_ACCESS_PHASE、 NGX_HTTP_TRY_FILES_PHASE這4個階段則不允許HTTP模塊加入自己的ngx_http_handler_pt方法處理用戶請求, 它們僅由HTTP框架實現。
1.NGX_HTTP_POST_READ_PHASE階段
       當HTTP框架在建立TCP連接後,再接收完HTTP請求頭,重定向url之前開始執行該階段的checker方法。目前ngx_http_relip_module模塊從NGX_HTTP_POST_READ_PHASE階段介入HTTP請求,他在postconfiguration方法中將自定義的ngx_http_handler_pt處理方法添加到HTTP框架。
2.GX_HTTP_SERVER_REWRITE_PHASE階段和NGX_HTTP_REWRITE_PHASE階段                 NGX_HTTP_SERVER_REWRITE_PHASE階段的checker方法是ngx_http_core_rewrite_phase。該階段的返回值有6個值,三種情況,分別對應處理中NGX_DONE,處理完畢NGX_DECLINED ,處理結束(NGX_AGAIN,NGX_DONE,NGX_ERROR)ngx_http_rewrite_module模塊定義了ngx_http_rewrite_handler方法, 同時將它
添加到了NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE階段。
3.NGX_HTTP_FIND_CONFIG_PHASE階段
     該階段是HTTP框架基於location設計的基石,不可跳過,任何一個HTTP模塊不可以項這個極端添加方法。
4.NGX_HTTP_REWRITE_PHASE階段
      NGX_HTTP_FIND_CONFIG_PHASE階段檢索到location後有機會再次利用rewrite(重
寫) URL,這一工作就是在NGX_HTTP_REWRITE_PHASE階段完成的。它的checker方法都是ngx_http_core_rewrite_phase。
5.GX_HTTP_POST_REWRITE_PHASE階段
       NGX_HTTP_POST_REWRITE_PHASE階段就像NGX_HTTP_FIND_CONFIG_PHASE階段一樣, 只能由HTTP框架實現,不允許HTTP模塊向該階段添加ngx_http_handler_pt處理方法。NGX_HTTP_POST_REWRITE_PHASE階段的checker方法是
ngx_http_core_post_rewrite_phase, 它的意義在於檢查rewrite重寫URL的次數不可以超過10次,以此防止由於rewrite死循環而造成整個Nginx服務都不可用。
6。NGX_HTTP_PREACCESS_PHASE階段
      NGX_HTTP_PREACCESS_PHASE階段一般用於對當前請求進行限制性處理
7.NGX_HTTP_ACCESS_PHASE階段
NGX_HTTP_ACCESS_PHASE階段與NGX_HTTP_PREACCESS_PHASE階段大不相同,這主要體現在它的checker方法是ngx_http_core_access_phase上。
8.NGX_HTTP_POST_ACCESS_PHASE階段
       NGX_HTTP_POST_ACCESS_PHASE階段又是一個只能由HTTP框架實現的階段, 不允
許HTTP模塊向該階段添加ngx_http_handler_pt處理方法。NGX_HTTP_POST_ACCESS_PHASE階段的checker方法是
ngx_http_core_post_access_phase, 它的工作非常簡單, 就是檢查ngx_http_request_t請求中的access_code成員, 當其不爲0時就結束請求(表示沒有訪問權限) ,否則繼續執行下一個
ngx_http_handler_pt處理方法。
10.NGX_HTTP_TRY_FILES_PHASE階段
      NGX_HTTP_TRY_FILES_PHASE階段也是一個只能由HTTP框架實現的階段, 不允許
HTTP模塊向該階段添加ngx_http_handler_pt處理方法。NGX_HTTP_TRY_FILES_PHASE階段的checker方法是ngx_http_core_try_files_phase,它是與nginx.conf中的try_files配置項密切相關的,如果try_files後指定的靜態文件資源中有一個可以訪問, 這時就會直接讀取文件併發送響應給用戶,.
11.NGX_HTTP_CONTENT_PHASE階段
      這是一個核心HTTP階段,可以說大部分HTTP模塊都會在此階段重新定義Nginx服務器的行爲。他提供了介入HTTP模塊的兩種方式。第一種通過向全局變量ngx_http_core_main_conf_t結構體的phases數組中添加ngx_http_handler_pt處理方法來實現。第二種通過ngx_http_handler_pt方法設置到location相關的ngx_http_core_loc_conf_t結構體的handler指針中。
12.NGX_HTTP_LOG_PHASE階段
日誌記錄

總的來說HTTP框架大部分階段是在:重寫URL,查詢location配置,判斷請求權限,讀取靜態資源文件。

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 2228
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章