编程技术分享平台

网站首页 > 技术教程 正文

Nginx处理HTTP请求头部的流程是怎样的

xnh888 2024-09-08 10:53:54 技术教程 26 ℃ 0 评论

Nginx框架先对客户端建立好连接,

然后接收用户发来的http请求行,比如:方法, url等。

然后再去接收所有的header。根据这些header信息 我们才能决定选用哪些配置块,决定让http模块怎样处理请求。



我们先来看一下Nginx框架是怎样建立连接,怎样接收http请求的?

首先经过内核三次握手建立连接, 然后经过Nginx负载均衡的算法选中一个worker。

这个worker进程 会调用epoll_wait 返回刚刚建立的连接的句柄fd。

此时这个句柄上实际上是有一个读事件,根据这个读事件,Nginx发现是它监听的80端口,于是就开始accept,这是会分配内存池,前面的文章我们介绍过,Nginx的内存池分为连接内存池和请求内存池2种。这时候分配的是连接内存池,默认值是512个byte。

接下来http模块开始接管请求,accept 新连接的时候 ngx_init_connection的回调方法就会被执行了。

这时会把新建立的读事件 通过epoll_ctl添加到epoll中,并且添加一个默认60s超时的定时器。

这一条龙流程走完,Nginx事件模块就会切到其他的fd去处理了。

当一个真正的post/get请求发来的时候,实际上发来data的。事件模块的epoll_wait又会拿到这个请求了。这次的回调方法则是ngx_http_wait_request_handler,这时候需要分配内存将内核态的data读取到用户态。这里有2个问题,内存是从哪里分配的?分配多少?

答案是从高处的连接内存池上分配的,默认client_header_buffer_size是要分配1k。这里如果配置是1k,就算data只有1个字节也会分配1k,就会存在浪费。那么如果header特别大1k不够怎么办呢?



有一个配置large_client_header_buffers:4 8K

这里的意思是如果1K不够,会分配8K内存,如果8K还不 就继续分配8K 分配到32K。


在接收完URI之后,接着就要接收header,我们注意到接收header这里也有一个分配大内存large_client_header_buffers:4 8K 这里的内存和之前那个是共用的。接收完完整的header就开始标识header了。然后就把之前设置的那个60s的定时器移除了。

最后就要开始http模块的11个处理流程,到底是哪11个处理流程呢?我们明天接着看。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表