Nginx從入門到精通閱讀筆記2

Request部分

 

Nginx中的http請求對應的數據結構是ngx_http_request_t,這是對一個http請求的封裝。Nginx通過它來保存解析請求與輸出響應相關的數據。 

一個請求從ngx_http_init_request開始,設置讀事件 ngx_http_process_request_line。然後通過ngx_http_read_request_header來讀取請求的數據,調用ngx_http_parse_request_line函數來解析請求行。爲了提高效率,1)用狀態機來解析請求行,2)將四個字符裝換成一個整形來比較。

解析完請求行,nginx會設置讀事件handler爲ngx_http_process_request_headers。Headers_in是ngx_http_request_t的域,是一個鏈表結構,保存所有的請求頭。HTTP中有些請求是需要特別處理的,這些請求頭與請求處理函數存放在一個映射表裏面,即ngx_http_headers_in,在初始化時,會生成一個hash表,當每解析到一個請求時,就會先在這個hash表中查找,如果找到,就調用相應的處理函數來處理這個請求頭。

當nginx解析到兩個回車換行符時,就表示請求頭的結束,此時就會調用ngx_http_process_request來處理請求。ngx_http_process_request會設置當前連接的讀寫事件處理函數爲ngx_http_request_handler,這個函數中會根據當前事件是讀還是寫分別調用read_event_handler或者write_event_handler。Nginx的做法是先不讀取請求body,所以設置read_event_handler爲ngx_http_block_reading,即不讀取數據了。然後在ngxz_http_handler裏面會設置write_event_handler爲ngx_http_core_run_phases,並執行。Nginx將一個http請求的處理分爲多個階段,這個函數就執行這些階段來產生數據。產生的相應頭會放在ngx_http_request_t中的headers_out中。

Nginx的各種階段會對請求進行處理,最後會調用filter來過濾數據,對數據進行加工。filter是一個鏈表結構,分別有header filter 和body filter,其中header filter的最後一個filter,即ngx_http_header_filter,這個filter將會遍歷所有的相應頭,最後輸出需要的響應頭在一個連續的內存,然後調用ngx_http_write_filter進行輸出。Body的情況類似。

 

其它相關概念:

Keep-Alive

Pipe

Lingering_close

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章