Nginx最大尺寸的含义“;大型“客户端”头“缓冲区”;指示

Nginx最大尺寸的含义“;大型“客户端”头“缓冲区”;指示,nginx,nginx-config,Nginx,Nginx Config,Nginx文档 Syntax: large_client_header_buffers number size; Default: large_client_header_buffers 4 8k; Context: http, server Sets the maximum number and size of buffers used for reading large client request header. 我了解缓冲区的大小,但不了解缓冲区的数量 处理是如何根据缓冲区的数量而

Nginx文档

Syntax: large_client_header_buffers number size;
Default: large_client_header_buffers 4 8k;
Context: http, server

Sets the maximum number and size of buffers used for reading large client request header. 
我了解缓冲区的大小,但不了解缓冲区的数量


处理是如何根据缓冲区的数量而变化的?

因此,我在晚上的大部分时间里一直在与一些HTTP头长度作斗争,并且必须解决这个问题

TL;DR buffer size是指缓冲区的大小,buffer number是指缓冲区的数量。因此,您的总容量是num_buffs*buff_size+1kb常规头缓冲区=总容量,但需要注意的是,只有在缓冲区中有足够的空间时,头才会进入缓冲区,或者换句话说,头不会在缓冲区之间分割

对于source,在过去的几个小时里,我一直在研究缓冲是如何工作的,方法是使用不同大小的头发出大量的curl请求

详细的解释。在Nginx中,有一个默认的头缓冲区,它是用
client\u header\u buffer\u size
指令配置的。当请求传入时,头首先读入该缓冲区,只要请求头的总大小不超过为
客户端头头头缓冲区大小配置的值,默认情况下,
大客户端头头头缓冲区不会被占用1kb

然而,一旦我们突破了这个限制,事情就会变得有趣起来。当Nginx将头读入缓冲区时,它将继续将头读入
客户机\u头\u缓冲区
,直到到达大于缓冲区中剩余空间的头,此时,
large\u client\u header\u buffers
变为活动状态,整个报头将被读入第一个
large\u client\u buffer
。然后,Nginx将继续将头读入
客户机头缓冲区
,直到它碰到另一个无法放入
客户机头缓冲区
剩余空间的头,然后检查是否可以将请求头放入第一个
大客户机头缓冲区
。如果不能,它将检查是否可以将头放入第二个
大客户机缓冲区
此过程将在每个缓冲区上进行,直到满足以下两个条件之一:

  • 所有标头都已成功处理并读入缓冲区
  • 任何缓冲区中都没有足够的空间来读取剩余的头,这可能是因为没有更多的缓冲区具有足够的空空间,或者是因为请求头大小超过了为缓冲区配置的大小 当出现条件2时,Nginx将响应一个错误,指示请求太大

    让我们通过一些例子来说明这一点

    在我们的示例中,我们假设我们已经将称为CHB的
    客户机头部缓冲区配置为10kb大小,并且我们已经配置了两个大小分别为20kb的
    大型客户机头部缓冲区
    ,分别称为LCHB1和LCHB2

    情景1:

    卷曲-H'h1:3kb长'-H'h2:2kb长'

    h2||

    h1||

    CHB | LCHB1 | LCHB2

    在这种情况下,我们的头总共只有5kb,因此很容易放入主缓冲区,并且我们可以在主缓冲区中支持多个头,只要它们的大小不超过5kb,无论是单个还是整体

    场景2大于CHB缓冲区的标头:

    卷曲-H'h1:14kb长'

    空的| h1|

    CHB | LCHB1 | LCHB2

    在本例中,头被直接读取到大缓冲区中,因为由于单个头超过了为主缓冲区配置的大小,主缓冲区中没有空间容纳它

    场景3使用的所有缓冲区:

    旋度-H'h1:19kb',-H'h2:19kb'-H'h3:9kb'

    h3 | h1 | h2

    CHB | LCHB1 | LCHB2

    在这种情况下,我们接收到一个不能进入主缓冲区的头,但它只能勉强进入一个大缓冲区,因此第一个头就进入了主缓冲区。然后下一个报头进入,也不能进入主缓冲区,但在第二个大缓冲区中有一个插槽,所以它进入主缓冲区。然后,最终的头可以放在主缓冲区的范围内

    场景3标题过多:

    旋度-H'h1:19kb',-H'h2:19kb'-H'h3:9kb'-H'h4:2kb'

    h4 | h3 | h1 | h2

    错误| CHB | LCHB1 | LCHB2

    在这种情况下,场景开始与场景3相似;然而,当我们引入额外的2kb头时,我们遇到了一个问题。因此,在每个大缓冲区中使用19kb的20kb,在主缓冲区中剩余1kb的情况下,我们还有3kb的缓冲区空间,因此我们应该能够正确处理最后的2kb头?错了,我的朋友。问题是,当2kb的头到达时,Nginx查看主缓冲区,发现那里只剩下1kb的空间,所以头不能到达那里,然后检查第一个大缓冲区,但仍然只有1kb的空间,所以它不能到达那里,最后检查最后一个大缓冲区,发现它仍然只有1kb的空间。此时,Nginx返回一个错误,表明它收到了错误的请求,因为它没有读取头的位置

    总之,缓冲区大小是指缓冲区的大小,但缓冲区的数量是该数量的倍数,即必须容纳请求头的不同缓冲区的数量