说明:
1. Nginx的HTTP核心模块只解析request的请求行和请求头,不会主动读取HTTP 请求body数据,但是提供了ngx_http_read_client_request_body方法,供各个filter模块处理。
2.ngx_http_wait_request_handler:等待read事件上来,并且等到HTTP的request数据
3. ngx_http_process_request_line:处理HTTP的request的请求行
4. ngx_http_process_request_header:处理HTTP的request的请求头
5. ngx_http_handler:HTTP核心处理函数,模块filter链的分发函数
6. 设置r->write_event_handler = ngx_http_core_run_phases,Nginx的write事件模块,从ngx_http_core_run_phases方法开始
为什么不主动读取HTTP BODY数据?
看到上面的图,可能很多人会比较奇怪了,为什么HTTP的核心模块只读取了HTTP协议的请求行和请求头,而没有读取HTTP的请求body内容。
因为大部分情况下,HTTP协议是不需要用到HTTP body中的数据的,例如你返回一张图片或者一个静态页面。
只有在需要将body数据传输到后端的例如Java、PHP等的时候,才会需要将HTTP的body数据带过去(POST请求、文件上传等)。所以Nginx只有在特殊的模块下(比如proxy模块,fastcgi模块,uwsgi模块等),才会去主动调用ngx_http_read_client_request_body方法,将body传递到后端。
源码分析
1. ngx_http_wait_request_handler 函数
等待read事件上来,并且等到HTTP的request数据。
ngx_http_wait_request_handler主要是一个等待数据到来的功能。里面有一个设计亮点: 此函数会一直等待TCP管道中的数据,如果触发了read事件,但是没有读取到数据,则Nginx会将buf内存删除,然后继续等待read事件的到来,好处是防止大量非法请求上来,又占用内存不释放,导致Nginx内存暴涨。