1. 程式人生 > >HTTP請求的11個處理階段

HTTP請求的11個處理階段

nginx服務 找到 做到 read strong 完整 dde 循環 location

摘自 陶輝 深入理解Nginx

幾乎所以有關Nginx書只要是講深入點的就會講到Nginx請求的11個處理階段,要記住這些真是不易,人腦特別不擅長記住各種東西,只能做些索引罷了,能做到知道這個知識點在哪兒能找到不就行了,可是你去面試還是問這些理論,所以這裏匯總下記錄如下

ngx_http_phases階段定義

typedef enum {
    // 在接收到完整的HTTP頭部後處理的HTTP階段
    NGX_HTTP_POST_READ_PHASE = 0,

    /*在將請求的URI與location表達式匹配前,修改請求的URI(所謂的重定向)是一個獨立的HTTP階段*/
    NGX_HTTP_SERVER_REWRITE_PHASE,

    /*根據請求的URI尋找匹配的location表達式,這個階段只能由ngx_http_core_module模塊實現,不建議其他HTTP模塊重新定義這一階段的行為*/
    NGX_HTTP_FIND_CONFIG_PHASE,

    /*在NGX_HTTP_FIND_CONFIG_PHASE階段尋找到匹配的location之後再修改請求的URI*/
    NGX_HTTP_REWRITE_PHASE,

    /*這一階段是用於在rewrite重寫URL後,防止錯誤的nginx.conf配置導致死循環(遞歸地修改URI),因此,這一階段僅由ngx_http_core_module模塊處理。目前,控制死循環的方式很簡單,首先檢查rewrite的次數,如果一個請求超過10次重定向,就認為進入了rewrite死循環,這時在NGX_HTTP_POST_REWRITE_PHASE階段就會向用戶返回500,表示服務器內部錯誤*/
    NGX_HTTP_POST_REWRITE_PHASE,

    /*表示在處理NGX_HTTP_ACCESS_PHASE階段決定請求的訪問權限前,HTTP模塊可以介入的處理階段*/
    NGX_HTTP_PREACCESS_PHASE,

    // 這個階段用於讓HTTP模塊判斷是否允許這個請求訪問Nginx服務器
    NGX_HTTP_ACCESS_PHASE,

    /*在NGX_HTTP_ACCESS_PHASE階段中,當HTTP模塊的handler處理函數返回不允許訪問的錯誤碼時(實際就是NGX_HTTP_FORBIDDEN或者NGX_HTTP_UNAUTHORIZED),這裏將負責向用戶發送拒絕服務的錯誤響應。因此,這個階段實際上用於給NGX_HTTP_ACCESS_PHASE階段收尾*/
    NGX_HTTP_POST_ACCESS_PHASE,

    /*這個階段完全是為try_files配置項而設立的,當HTTP請求訪問靜態文件資源時,try_files配置項可以使這個請求順序地訪問多個靜態文件資源,如果某一次訪問失敗,則繼續訪問try_files中指定的下一個靜態資源。這個功能完全是在NGX_HTTP_TRY_FILES_PHASE階段中實現的*/
    NGX_HTTP_TRY_FILES_PHASE,

    // 用於處理HTTP請求內容的階段,這是大部分HTTP模塊最願意介入的階段
    NGX_HTTP_CONTENT_PHASE,

    /*處理完請求後記錄日誌的階段。例如,ngx_http_log_module模塊就在這個階段中加入了一個handler處理方法,使得每個HTTP請求處理完畢後會記錄access_log訪問日誌*/
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;
  • NGX_HTTP_POST_READ_PHASE階段

  • NGX_HTTP_SERVER_REWRITE_PHASE階段

  • NGX_HTTP_FIND_CONFIG_PHASE階段

  • NGX_HTTP_REWRITE_PHASE階段

  • NGX_HTTP_POST_REWRITE_PHASE階段

  • NGX_HTTP_PREACESS_PHASE階段

  • NGX_HTTP_ACCESS_PHASE階段

  • NGX_HTTP_POST_ACCESS_PHASE階段

  • NGX_HTTP_TRY_FILES_PHASE階段

  • NGX_HTTP_LOG_PHASE階段

HTTP請求的11個處理階段