原創:https://blog.csdn.net/ndzjx/article/details/89323732
HTTP框架存在的主要目的有兩個:
1:針對基於TCP的事件框架解決好HTTP的網絡傳輸、解析、組裝等問題。
2:爲HTTP模塊屏蔽事件驅動架構,使得HTTP模塊不需要關心網絡事件的處理。
TCP網絡事件,可粗略的分爲:
可讀事件:收到SYN包帶來的新連接事件,收到FIN包帶來的連接關閉事件,套接子緩衝區上真正收到TCP流。
可寫事件:(Nginx提供限速功能,有時可寫事件觸發時未必可以去發送響應。)
HTTP框架依靠事件機制實現的,完成最主要的4項工作:
1:集成事件驅動機制,管理用戶發起的TCP連接,處理網絡讀寫事件,並在定時器中處理請求超時的事件。
2:與各個HTTP模塊共同處理請求。
3:允許將一個請求分解爲多個子請求。
4:提供基本的工具接口,供HTTP模塊使用(如接受HTTP包體,發送HTTP響應頭部、響應包體等)
HTTP框架處理請求的第一步在ngx_http_init_connection方法中。新建立連接的可讀事件處理方法設置爲ngx_http_wait_request_handler。
HTTP框架不會在連接建立成功後就開始初始化請求,而是在連接對應的套接字緩衝區上確實收到了用戶發來的請求內容時才進行。
接收HTTP請求行 ngx_http_process_request_line
接受HTTP頭部 ngx_http_process_request_headers
處理HTTP請求 ngx_http_process_request/ngx_http_request_handler
ngx_event_t的data指向了ngx_connection_t連接,ngx_connection_t的data指向了ngx_http_request_t結構體。
接收包體 ngx_http_read_client_request_body/ngx_http_read_client_request_body_handler
丟棄包體 ngx_http_discard_request_body
發送HTTP響應:ngx_http_send_header方法(構造HTTP響應行、頭部,同時會把他們發送給客戶端)和ngx_http_output_filter方法(發送響應包體),這兩個方法都會調用ngx_http_write_filter
ngx_http_core_rewrite_phase不會導致跨過同一個HTTP階段的其他處理方法,就直接跳到下一個階段來處理請求。rewrite階段所有的模塊時平等的。
HTTP框架要求在請求的某個動作結束時,必須調用ngx_http_finalize_request方法來結束請求。
從底層到上層分別爲:
ngx_http_close_connection
ngx_http_free_request
ngx_http_close_request
ngx_http_finalize_connection
ngx_http_terminate_request
ngx_http_finalize_request