百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx Header 整理(nginx client_header_buffer)

off999 2025-02-03 14:31 19 浏览 0 评论

  • client_max_body_size
  • large_client_header_buffers
  • client_header_buffer_size
  • Testing

很多时候服务端响应报错的时候,可能会跟Header的设置有关,所以整理下这部分.另外关于400的报错也有一些,贴出来

# Detail about 400 and collect

```

当服务器返回HTTP状态码400 Bad Request 时,这通常表示客户端发送的请求存在语法错误或无法被服务器理解。这个状态码是一个通用的客户端错误,它可以有多种可能的原因。以下是一些常见的导致400 Bad Request错误的情况以及可能的解决方法:

1. **语法错误的请求**:客户端发送的请求可能包含语法错误,例如不正确的HTTP方法、无效的请求头或无效的请求主体。解决方法是仔细检查请求,确保它符合HTTP协议的规范。您可以使用HTTP调试工具来验证请求的格式和语法。

2. **缺少必要的请求头或参数**:某些请求需要特定的请求头或参数,如果缺少这些必要的信息,服务器无法正确理解请求。解决方法是确保请求包含了必要的头部和参数,并且它们的值是有效的。

3. **请求内容太大**:如果请求主体的大小超过了服务器的限制,服务器可能会返回400错误。这通常是为了防止恶意或过大的请求。您可以尝试减小请求主体的大小或与服务器管理员联系以增加限制。

4. **URL编码问题**:URL中的特殊字符需要进行正确的URL编码。如果URL包含无效的字符或没有正确编码,服务器可能无法解析请求。确保URL中的特殊字符已正确编码。

5. **无效的请求方法**:每个HTTP请求都需要使用有效的请求方法,如GET、POST、PUT等。如果使用了不支持的方法或拼写错误,服务器将无法理解请求。检查请求的HTTP方法是否正确。

6. **身份验证问题**:某些资源要求身份验证才能访问,如果客户端未提供有效的身份验证凭据,服务器可能会返回400错误。确保您提供了适当的身份验证信息。

7. **缺少必要的Cookie或Session信息**:如果服务器依赖于Cookie或Session信息来处理请求,客户端必须正确发送这些信息。确保您的请求包含了所需的Cookie或Session信息。

8. **非法字符或不安全输入**:请求中包含可能被认为是恶意的字符或输入,服务器为安全起见拒绝处理。确保请求中不包含不安全的内容。

解决400 Bad Request错误通常需要仔细检查请求,确保其符合HTTP协议的规范,并根据具体情况进行相应的修复。如果问题仍然存在,查看服务器的错误日志或与服务器管理员联系以获取更多的帮助和指导。

client_max_body_size

https://nginx.org/en/docs/http/ngxhttpcoremodule.html#clientheader_timeout

Syntax: clientmaxbodysize size; Default: clientmaxbodysize 1m; Context: http, server, location Sets the maximum allowed size of the client request body. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.

clientmaxbodysize:控制客户端请求主体的最大大小。如果请求主体大于此值,nginx将返回413 Request Entity Too Large错误 这个指令设置了客户端允许发送的最大请求体大小。如果请求的大小超过这个值,Nginx会返回一个"413 Request Entity Too Large"的错误。默认值是1m。例如,clientmaxbodysize 8m;将允许最大8MB的请求体。

This configuration sets the maximum size of a client's request body that Nginx will accept. The default value is 2048kB. If the request body size exceeds this limit, Nginx will return a 413 (Request Entity Too Large) status code.

large_client_header_buffers

  • nginx.conf
    http {
      include       mime.types;
      default_type  application/octet-stream;
      #increase proxy buffer size
      proxy_buffer_size 32k;
      proxy_buffers 4 128k;
      proxy_busy_buffers_size 256k;
      #increase the header size to 32K
      large_client_header_buffers  4 32k;
    ```
- About client_max_header_size
定义读取大请求头时使用的缓冲区个数和大小。多个缓冲区可以更快地读取大请求头

这个指令在nginx 1.19.7 版本之后就已经废弃了,官方文档也有说明^3。这个指令是用来限制HPACK解压后的整个请求头部列表的最大大小的^3。现在应该使用large_client_header_buffers 这个指令来代替^2^3。这个指令是用来设置客户端请求头部的最大数量和每个缓冲区的大小的^1。如果你想了解更多关于这两个指令的用法,你可以参考以下链接^1^2^3
这个指令来代替^2^3。这个指令是用来设置客户端请求头部的最大数量和每个缓冲区的大小的
- reference: 
Source: Conversation with Bing, 9/14/2023
(1) Module ngx_http_v2_module - nginx. https://nginx.org/en/docs/http/ngx_http_v2_module.html.
(2) Some obsolete warnings logged #7261 - GitHub. kubernetes/ingress-nginx#7261.
(3) Maximum on HTTP header values? - Stack Overflow. https://stackoverflow.com/questions/686217/maximum-on-http-header-values.
(4) undefined. https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx.
(5) undefined. https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx.

- eg:

Syntax: large_client_header_buffers number size;
Default:
large_client_header_buffers 4 8k; large_client_header_buffers 4 32k;
Context: http, server
Sets the maximum number and size of buffers used for reading large client request header.
A request line cannot exceed the size of one buffer, or the 414 (Request-URI Too Large) error is returned to the client.
A request header field cannot exceed the size of one buffer as well, or the 400 (Bad Request) error is returned to the client.
Buffers are allocated only on demand. By default, the buffer size is equal to 8K bytes
If after the end of request processing a connection is transitioned into the keep-alive state, these buffers are released.
设置用于读取大型客户端请求标头的缓冲区的最大数量和大小。 请求行不能超过一个缓冲区的大小,
否则会向客户端返回 414(Request-URI Too Large)错误。 请求头字段也不能超过一个缓冲区的大小,
否则会向客户端返回 400(Bad Request)错误。 缓冲区仅按需分配。 默认情况下,缓冲区大小等于 8K 字节。
如果请求处理结束后连接转换为保持活动状态,则释放这些缓冲区。

- summary

large_client_header_buffers 指令会将请求头缓存在内存中,如果请求头超过了任何一个缓冲区的大小,Nginx 将会分多次读取请求头。
因此,如果请求头超过了 large_client_header_buffers 指令配置的值,Nginx 将不会返回 414 Request-URI Too Large 错误,而是会继续读取请求头。
该配置表示 Nginx 将会使用 4 个缓冲区来缓存请求头,每个缓冲区的大小为 4k。如果请求头超过了 4k * 4 = 16k,Nginx 将会分多次读取请求头。


  • client_body_buffer_size
读取请求主体时使用的缓冲区大小。根据请求主体的平均大小进行调整,可以优化性能
这个指令设置了在内存中读取请求体的缓冲区大小。如果请求体大于这个缓冲区的大小,Nginx会将其写入到磁盘的临时文件中。例如,client_body_buffer_size 128k;设置了128KB的缓冲区大小
- eg
```bash
https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size
Sets buffer size for reading client request body. In case the request body is larger than the buffer,
the whole body or only its part is written to a temporary file. By default, buffer size is equal to two memory pages.
This is 8K on x86, other 32-bit platforms, and x86-64. It is usually 16K on other 64-bit platforms.
```
如果设置的 client_body_buffer_size 大于客户端请求正文的大小,则整个请求正文都将存储在缓冲区中。但是,如果请求正文大于缓冲区的大小,nginx就会把多余的数据写入临时文件。
需要注意的是,client_body_buffer_size指令只影响客户端请求正文的缓冲,而不影响响应的缓冲
  • client_header_buffer_size
读取请求头时使用的缓冲区大小。根据请求头的平均大小进行调整,可以优化性能
Syntax:	client_header_buffer_size size;
Default:	
client_header_buffer_size 1k;
Context:	http, server
Sets buffer size for reading client request header. For most requests, a buffer of 1K bytes is enough. However, 
if a request includes long cookies, or comes from a WAP client, it may not fit into 1K. 
If a request line or a request header field does not fit into this buffer then larger buffers, 
configured by the large_client_header_buffers directive, are allocated.

Testing

发送一个大小为100MB的请求主体

curl -X POST -d @100MB.file http://localhost/upload

设置请求头的大小为16KB

curl -H "Large: $(perl -e 'print "a"x16384') http://localhost/ 使用perl在运行时生成一个约16KB大小的大请求头large_header,然后在curl命令中使用-H参数将这个头部附加到请求中

设置请求主体的最大大小为1MB

curl --limit-rate 1M -T file.txt http://localhost/upload

使用curl工具模拟发送大头部POST请求的方法很好,我来补充一下具体的命令示例:

生成一个大约16KB的请求头

large_header=$(perl -e 'print "X-Large: " . "a" x 16384')

使用curl发送POST请求,头部包含刚刚生成的large_header

curl -H "$large_header" -X POST http://example.com/api/post

- 直接用Shell脚本来生成大请求头并通过curl发送,无需借助其他语言如Perl。下面是使用Shell实现的示例:

生成16KB大小的请求头

large_header=$(printf 'X-Large: %0.s' {1..2048})

发送POST请求,带有我们构造的大请求头

curl -H "$large_header" -X POST http://example.com/api/post 这里我们使用printf命令可以轻松生成自定义大小的字符串,作为请求头的值。

然后在curl命令中通过-H参数传递这个大请求头。

这样就避免了使用其他语言来生成大字符串的复杂性。利用Shell自身的字符串处理功能就可以实现构造大请求头并测试。

用curl工具来模拟发送包含大请求体(body)的HTTP请求

具体的命令示例:

生成一个100MB大小的大文件big.bin

dd if=/dev/urandom of=big.bin bs=100M count=1

用curl发送POST请求,请求体来自刚生成的大文件

curl -T big.bin http://example.com/upload 首先我们使用dd命令生成一个100MB的大文件big.bin。

然后在curl命令中使用-T参数指定这个大文件作为请求体发送出去。

使用curl工具模拟发送大请求体(large body)的POST请求的示例:

生成一个10MB大小的大文件large_file.bin

dd if=/dev/urandom of=large_file.bin bs=10M count=1

使用curl发送POST请求,请求体来自上面生成的大文件

curl -T largefile.bin -H "Content-Type: application/octet-stream" http://example.com/upload 这里我们首先用dd命令生成一个10MB大小的大文件largefile.bin。

然后使用curl的-T参数指定这个文件作为POST请求的请求体发送出去。

同时设置Content-Type头表明是二进制 octet stream类型。

如果example.com服务器对请求体大小有限制,比如最大10MB,那么就会返回类似"413 Entity Too Large"的错误信息。

通过这种方式,我们可以定制不同大小的请求体文件来测试服务器处理请求的能力。

```

相关推荐

让 Python 代码飙升330倍:从入门到精通的四种性能优化实践

花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...

7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制

“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...

Python3.14:终于摆脱了GIL的限制

前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...

Python Web开发实战:3小时从零搭建个人博客

一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...

图解Python编程:从入门到精通系列教程(附全套速查表)

引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...

Python 并发编程实战:从基础到实战应用

并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...

吴恩达亲自授课,适合初学者的Python编程课程上线

吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...

Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件

在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...

Python turtle模块编程实践教程

一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...

Python 中的asyncio 编程入门示例-1

Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...

30天学会Python,开启编程新世界

在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...

Python基础知识(IO编程)

1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...

Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!

Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...

一文带你了解Python Socket 编程

大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...

Python-面向对象编程入门

面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...

取消回复欢迎 发表评论: