Nginx源碼分析—HTTP架構執行流程

來源:互聯網
上載者:User

標籤:nginx

Nginx源碼分析—HTTP架構執行流程

         HTTP架構動態執行中的大概流程:先與用戶端建立TCP串連,接收HTTP請求行、頭部並解析出他們的意義,再根據nginx.conf設定檔找到一些HTTP模組,使其一次合作者處理這個請求。

         為了精確地控制逾時,還需要把讀寫事件放置到定時器中。

         通過事件模組提東的ngx_handle_read_event方法和ngx_handle_write_event方法,可以把相應的事件添加到epoll中,我們可以起到在滿足事件觸發條件時,ngxin進程會調用ngx_event_t事件的handler回調方法執行業務。而通過事件模組通過的ngx_add_timer方法可以將上面的讀事件或者寫事件添加到定時器中,在滿足逾時條件後,Nginx進程同樣會調用調用ngx_event_t事件的Handler回調方法執行業務。

         TCP串連建立成功以後,TCP串連上第一次出現可讀事件時,將會調用ngx_http_init_request方法初始化這個HTTP請求,HTTP架構並不會在串連建立成功後就開始初始化請求,而是在這個串連的通訊端緩衝區傻瓜確實接收到使用者發來的請求內容時才進行。

         每個HTTP模組都可以針對一個請求設定上下文結構體,並通過ngx_http_set_ctx和ngx_http_get_module_ctx宏來設定和擷取上下文,這些HTTP模組針對請求設定的上下文結構體指標,實際上時儲存到ngx_http_request_t結構體的ctx指標數組中的。

         Ngx_http_core_content_phase是NGX_HTTP_CONTENT_PHASE階段的checker方法,可以說他是我們開發HTTP模組時最常用的一個階段,NGX_HTTP_CONTENT_PAHSE階段用於真正處理請求的內容。其餘10個階段中個HTTP模組的處理方法都是放在全域的ngx_http_core_main_conf_t結構體中的,也就是說,他們對任何一個HTTP請求都是有效。但在NGX_HTTP_CONTENT_PHASE階段卻是很自然地有另一種需求,有的HTTP模組可能僅今希望在這個處理請求內容的階段,僅針對某種請求唯一生效,而不是對所有請求生效。例如,僅當請求的URI匹配了設定檔中的某個Locatin塊時,再根據Location塊下的配置選擇一個HTTP模組執行他的Handler處理方法,並以此替代NGX_HTTP_CONTENT_PHASE階段的其他handler方法(這些handler方法對於該請求將得不到執行),這個方式被設定為ngx_http_core_loc_conf_t中的handler

        

         處理Post請求,調用ngx_http_run_poted_requests方法處理Post請求。

         如果一個請求同時需要與多個上遊伺服器打交道,同時處理多個TCP串連,那麼它需要處理的事件就太多了,這種複雜度會使得模組難以維護,通過使用subrequest機制

         一個請求通常由必選的HTTP請求行、要求標頭部、以及可選的包體組成。

         Ngx_http_send_header方法負責狗仔HTTP相應行、頭部,同時會把他們發送給用戶端。他是一個過濾鏈表,最後一個節點負責發送,就是過濾模組ngx_http_header_filter_modlue提供的ngx_http_header_filter方法則會根據HTTP規則把headers_out中的成員變數序列化為字元流,如果無法一次把相應頭髮送出去怎麼辦?這就需要使用ngx_http_request_t結構體中ngx_chain_t類型的成員Out了,它將會儲存沒有發送完的相應頭部,如何發送剩餘的相應頭部,需要結合結束請求的ngx_http_finalize_request方法來說。

         當ngx_http_header_filter方法無法一次性發送HTTP頭部時,將會有以下兩個現象同時發生,請求的Out成員中將會儲存剩餘的相應頭部,Ngx_http_header_filter方法返回NGX_AGAIN.

         如果這個響應沒有包體,那麼這時通常已經可以調用ngx_http_finalize_request方法來結束請求了,此函數的第二個參數很關鍵,我們需要把NGX_AGAIN傳進去,這樣ngx_http_finalize_request方法就理解了實際上還需要HTTP架構繼續發送請求Out成員中儲存的剩餘響應字元流。Ngx_http_finalize_request方法會佈建要求的write_event_handler成員為ngx_http_write方法,這樣,當串連上有可寫事件時,就會調用ngx_http_write方法繼續發送剩餘的HTTP響應。Ngx_http+finalize_request方法結合第二個參數可以有很多中執行流程。

Nginx源碼分析—HTTP架構執行流程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.