【问题标题】:Meaning of max size of Nginx "large_client_header_buffers" directiveNginx“large_client_header_buffers”指令的最大大小的含义
【发布时间】:2019-07-23 01:10:30
【问题描述】:

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 nginx-config


    【解决方案1】:

    所以我大半夜都在与一些 HTTP 标头长度作斗争,不得不弄清楚这一点。

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

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

    详细解释。在 Nginx 中,有一个使用 client_header_buffer_size 指令配置的默认标头缓冲区。当请求进入时,标头首先被读入此缓冲区,只要请求标头的总大小不超过为 client_header_buffer_size 配置的值(默认为 1kb),large_client_header_buffers 就不会参与。

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

    1. 所有标头均已成功处理并读入缓冲区

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

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

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

    对于我们的示例,我们假设我们已将 client_header_buffer(称为 CHB)配置为 10kb 的大小,并且我们配置了两个 large_client_header_buffers,每个大小为 20kb,分别称为 LCHB1 和 LCHB2 .

    场景 1 原版:

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

    h2 | |

    h1 | |

    CHB | LCHB1 | LCHB2

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

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

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

    空 | h1 |

    CHB | LCHB1 | LCHB2

    在这种情况下,标头被直接读入大缓冲区,因为单个标头超出了为主缓冲区配置的大小,因此主缓冲区中没有空间。

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

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

    h3 | h1 | h2

    CHB| LCHB1 | LCHB2

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

    场景 3 标题过多:

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

    h4 | h3 | h1 | h2

    错误 |慢性乙型肝炎 | LCHB1 | LCHB2

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 2021-05-19
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多