gpt4 book ai didi

nginx - Nginx "large_client_header_buffers"指令最大大小的含义

转载 作者:行者123 更新时间:2023-12-03 15:07:10 25 4
gpt4 key购买 nike

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 header 长度作斗争,不得不弄清楚这一点。

TL;DR 缓冲区大小是您的缓冲区有多大,缓冲区编号是您拥有的缓冲区数量。因此,您的总容量为 num_buffs*buff_size + 1kb 常规 header 缓冲区 = 总容量,需要注意的是,如果缓冲区中有足够的空间, header 只会进入缓冲区,或者换句话说, header 不会在缓冲区之间拆分.

对于源代码,我一直在通过使用不同大小的 header 发出大量 curl 请求来弄清楚过去几个小时缓冲是如何工作的。

详细的解释。在 Nginx 中,有一个默认的 header 缓冲区,它配置了 client_header_buffer_size指示。当请求进入时,头信息首先读入这个缓冲区,large_client_header_buffers只要请求 header 的总大小不超过为 client_header_buffer_size 配置的值,就不要参与。 , 默认为 1kb。

然而,一旦我们突破了这个限制,事情就会变得有趣。当 Nginx 将头读入缓冲区时,它将继续将它们读入 client_header_buffer直到一个大于缓冲区剩余空间的头到达,此时 large_client_header_buffers变为事件状态,然后整个标题将被读入第一个 large_client_buffer .然后 Nginx 将继续将 header 读入 client_header_buffer直到它碰到另一个无法放入 client_header_buffer 中剩余空间的标题此时它将检查是否可以将请求头放在第一个 large_client_buffer 中。 .如果不能,它将检查是否可以将标题放在第二个 large_client_buffer 中。这个过程将在每个缓冲区上发生,直到满足两个条件之一:

  • 所有 header 都被成功处理并读入缓冲区

  • 或者
  • 任何缓冲区中都没有足够的空间来读取剩余的 header ,因为没有更多的缓冲区具有足够的空白空间,或者因为请求 header 大小超过了为缓冲区配置的大小。

  • 当条件 2 发生时,Nginx 将响应一个错误,指示请求太大。

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

    对于我们的示例,我们假设我们已经配置了 client_header_buffer ,简称CHB,大小为10kb,我们配置了两个 large_client_header_buffers每个大小为 20kb,分别称为 LCHB1 和 LCHB2。

    场景 1 Vanilla :

    curl https://example.com -H 'h1: 3kb-long' -H 'h2: 2kb-long'

    h2 | |

    H1 | |

    CHB | LCHB1 | LCHB2

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

    场景 2 比 CHB 缓冲区大的 header :

    curl https://example.com -H 'h1: 14kb-long'

    空 | H1 |

    CHB | LCHB1 | LCHB2

    在这种情况下, header 被直接读入大缓冲区,因为由于单个 header 超出了为主缓冲区配置的大小,主缓冲区中没有空间容纳它。

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

    curl https://example.com -H 'h1: 19kb', -H 'h2: 19kb' -H 'h3: 9kb'

    h3 | H1 |小时2

    乙肝| LCHB1 | LCHB2

    在这种情况下,我们收到一个无法进入主缓冲区但刚好适合其中一个大缓冲区的 header ,因此第一个 header 进入那里。然后下一个头进入,也不能进入主缓冲区,但在第二个大缓冲区中有一个插槽,所以它进入那里。然后最终的 header 可以适合主缓冲区的范围

    场景 3 标题过多:

    curl https://example.com -H 'h1: 19kb', -H 'h2: 19kb' -H 'h3: 9kb' -H 'h4: 2kb'

    h4 | h3 | H1 |小时2

    错误 | CHB | LCHB1 | LCHB2

    在这种情况下,场景开始上演类似于场景 3;然而,当我们引入一个额外的 2kb header 时,我们遇到了一个问题。因此,在每个大缓冲区中使用 20kb 中的 19kb 和主缓冲区中剩余 1kb 的情况下,我们还有 3kb 的缓冲区空间,所以我们应该能够处理最后的 2kb header ,对吗?错了,我的 friend 。问题是当 2kb 头到达时 Nginx 在主缓冲区中查看并看到那里只剩下 1kb 的空间所以头不能去那里,然后它检查第一个大缓冲区,但仍然只有 1kb 的空间所以它不能去那里,最后它检查最终的大缓冲区才发现它仍然只有 1kb 的空间。此时 Nginx 返回一个错误,表明它收到了一个错误的请求,因为它无法将头读入。

    因此,总而言之,缓冲区大小是您拥有的缓冲区有多大,但缓冲区的数量是该数字的乘数,即您必须保存请求 header 的不同缓冲区的数量。

    关于nginx - Nginx "large_client_header_buffers"指令最大大小的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54937220/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com