nginx中request buf的设计和实现

在nginx中request的buffer size我们能够通过两个命令进行设置,分别是large_client_header_buffers和client_header_buffer_size。这两个是有所不同的。
在解析request中,如果已经读取的request line 或者 request header大于lient_header_buffer_size的话,此时就会重新分配一块大的内存,然后将前面未完成解析的部分拷贝到当前的大的 buf中,然后再进入解析处理,这部分的buf也就是large_client_header_buffers,也叫做large hader的处理。接下来我会通过代码来详细的分析这个过程。

首先来看client_header_buffer_size,他的默认值是1024,用这个值来初始化header_in(在ngx_http_init_request中)。

然后我们来看当已经接收的request line或者request header大于设置的client_header_buffer_size的时候,nginx如果处理,这里nginx判断接收的数据大小在两个地方, 一个是在处理request line,一个是处理request header时候。首先来看的是处理request line的时候,下面这段代码是在ngx_http_process_request_line中的,到达下面这里说明request line只解析了一部分,因此这里需要判断是否分配的buf已经全部使用了,如果全部使用则需要进入large header的处理部分。

第二个地方就是处理request head,这部分是在ngx_http_process_request_headers中进行的,流程和上面的类似。

 

从上面两段代码我们可以看到处理large header的部分都是在ngx_http_alloc_large_header_buffer中。因此接下来我们就来详细的分析这个函数。

首先来看这个函数的声明

可以看到它的第二个函数表示了是在处理request line还是说是request header。我们来一段段的分析这个函数。
下面这段首先判断如果是在处理完request_line并且状态为0,则说明用户的request line的第一行是空(注释里面写的比较详细),此时我们需要忽略这个回车换行。

然后接下来这部分就是判断已经解析完毕的request line或者header的大小是否大于large_client_header_buffers的大小,如果大于则说明当前的request 太长,所以直接返回。

接下来这部分就是准备分配新的内存供request使用。这里有一个http_connection的概念,在nginx中,这个主要用于 pipeline请求和keepalive请求,等以后详细分析pipeline和keepalive的时候会涉及到这个东西,现在只需要知道这个东西主 要是为了buf的重用来设计的。

下面这段就开始复制request buf.

最后一部分就是更新对应的指针

 

留下评论

电子邮件地址不会被公开。 必填项已用*标注