nginx详解

本文详细解释了Nginx的HTTP核心模块如何处理请求行和请求头,而不主动读取HTTP请求body数据的原因及实现机制,并介绍了ngx_http_read_client_request_body方法的应用场景。
摘要由CSDN通过智能技术生成

说明:

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数据传输到后端的例如JavaPHP等的时候,才会需要将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内存暴涨。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值