Nginx的重要概念之request


什么是request?

  request是指Nginx中的http請求,Nginx用結構體ngx_http_request_t對一個http請求進行封裝,其中一個http請求包括請求行、請求頭、請求體、響應行、響應頭、響應體。

webserver是如何處理http請求的?

  http請求是請求-響應類型的網絡協議,http是文件協議,我們在分析請求行、請求頭和輸出響應行與響應頭的時候都是一行行處理的。一個普通的http服務器在連接建立好后,接收到客戶端發來的請求,它會讀取一行數據,分析請求行中的method、uri、http_version等信息,然后再一行行處理請求頭,並根據method與請求頭信息來決定是否有請求體及請求體的長度,然后再讀請求體。當請求產生需要輸出的數據,就會生成響應行、響應頭和響應體,並將響應發送給客戶端。

Nginx是如何處理http請求的?

  與webserver類似,Nginx在請求頭讀取完成后,通過ngx_http_request_t來保存解析請求與輸出響應相關的數據。Nginx的處理請求的步驟如下:

  1. 通過ngx_http_init_request函數初始化請求
  2. 設置讀事件為ngx_http_process_request_line函數
  3. 通過ngx_http_read_request_header函數來讀取請求數據
  4. 調用ngx_http_parse_request_line函數解析請求行
  5. 將請求行解析到的參數,保存到ngx_http_request_t結構中
  6. 設置讀事件為ngx_http_process_request_headers函數,后續的請求就在ngx_http_process_request_headers中進行讀取與解析
  7. 通過ngx_http_read_request_header函數讀取請求頭
  8. 調用ngx_http_parse_request_line函數來解析請求頭
  9. 解析到的請求頭保存在ngx_http_request_t的域headers_in(一個鏈表結構,保存所有的請求頭,請求頭與請求處理函數存放在ngx_http_headers_in映射表里,初始化時會生成hash表,當解析到一個請求頭后,就會在hash表里查找,如果有找到,就調用相應的處理函數來處理這個請求頭)里
  10. 當解析到兩個回車換行符時,請求頭結束,調用ngx_http_process_request來處理請求。
  11. ngx_http_process_request設置當前的連接的讀寫事件處理函數為ngx_http_request_handler(讀事件和寫事件分別調用ngx_http_request_t中的read_event_handler和write_event_handler)
  12. 調用ngx_http_handler開始真正的處理一個完整的http請求,設置write_event_handler為ngx_http_core_run_phases並執行。
  13. 產生的響應頭放在ngx_http_request_t的headers_out中。

注意,Nginx會將請求頭放在一個buffer里(buffer大小通過配置項client_header_buffer_size配置),如果請求頭過大,Nginx會重新分配一個新的更大的buffer來裝請求頭(大buffer可以通過large_client_header_buffers設置)。為了保存請求行或請求頭的完整性,一個完整的請求頭或請求行,需要放在一個連續的內存里面,所以一個完整的請求行或請求頭,只會保存在一個buffer。如果請求行大於buffer的大小,會返回414,如果請求頭大於buffer大小,會返回400。

根據以上的流程步驟畫的Nginx處理http請求的流程圖如下

以上總結參考https://mp.weixin.qq.com/s/bXtI45d7M-XjkJH3ARZiMQ 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM