欢迎使用6miu-markdown编辑器

    xiaoxiao2021-03-25  247

    说明:

    Nginx的HTTP核心模块只解析request的请求行和请求头,不会主动读取HTTP 请求body数据,但是提供了ngx_http_read_client_request_body方法,供各个filter模块处理。

    2.ngx_http_wait_request_handler:等待read事件上来,并且等到HTTP的request数据

    ngx_http_process_request_line:处理HTTP的request的请求行

    ngx_http_process_request_header:处理HTTP的request的请求头

    ngx_http_handler:HTTP核心处理函数,模块filter链的分发函数

    设置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内存暴涨。

    转载请注明原文地址: https://ju.6miu.com/read-343.html

    最新回复(0)