Nginx Header 整理(nginx client_header_buffer)
off999 2025-02-03 14:31 18 浏览 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基础模块三剑客:sys、os、shutil(增加示例代码)
-
注:上个篇由于不熟悉头条号编辑器,导致示例代码丢失。现在全部以图片的形式加回。有同学问了个问题:在python里如何复制、删除、重命名文件?有个同学知道os.system(),就回答说:os.syst...
- Python常用文件操作库使用详解(python 对文件操作)
-
Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能:文件...
- 你知道Python 如何进行高效的代码重构吗?
-
点赞、收藏、加关注,下次找我不迷路写出高质量的代码是每个程序员的追求。而代码重构作为提升代码质量的重要手段,却常常被新手忽视。很多新手在编写代码时,只关注功能是否实现,却不注重代码的结构和可维护性,...
- Python常用内置模块介绍——文件与系统操作详解
-
Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互os模块提供了与操作系统交互的接口,包括文件/目录操作、进程管理、环...
- Python的tarfile模块解压缩.tar/.tar.gz等文件
-
python中的标准库tarfile模块可以帮助我们快速压缩或者解压后缀为.tar/.tar.gz/.tar.bz2/.tar.xz的文件。01、tarfile核心类与函数介绍使用方法因为tarfil...
- 批量重命名工具,Bulk Rename Utility软件体验
-
平常在电脑上处理电子文件,经常在得到文件本身时,没有空闲和精力去为文件重命名,像是一张图片,要作为下一个步骤的素材。而处理完事过后就不理它了,顺手直接丢回收站或者放在硬盘里。但是想把文件存档和提交给上...
- 照片怎样重命名?方法有四种(照片怎么可以重命名)
-
照片怎样重命名?照片在我们日常生活中扮演着越来越重要的角色,但是有时候,我们需要对照片进行重命名,以便更好地组织和查找它们,这样也可以大大提高我们的效率。在这篇文章中,我们将介绍四种简单的方法,让你轻...
- 你需要批量创建文件夹并命名吗,给你推荐几个方法
-
小李是一家设计公司的项目经理,最近接了一个大项目,需要整理大量的设计稿。每个设计稿都需要单独创建一个文件夹,以方便团队成员协作。手动创建文件夹效率太低,而且容易出错。小李在网上搜索了各种方法,尝试了P...
- 怎样批量重命名一个工作簿中的所有工作表
-
上篇文章,Python数据的选取和处理,阅读量93,收藏15,没有评论。目前正在复习Python+Excel实现办公自动化,有兴趣的可以一起讨论,共同提高。花了近4个小时终于把6个分部的统计工作表做好...
- Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
-
在Windows系统中药批量修改文件后缀名的方式非常多,每个方法的优缺点各有不同,下面通过几个常见的方式给大家介绍下,Windows如何批量修改文件后缀名的。给有需要的朋友几个参考。方法一:使用文件资...
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌 + 实战技巧,全搞懂!
-
Python3+变量命名规则与约定详解一、官方命名规则(必须遵守)1.合法字符集变量名只能包含:大小写字母(a-z,A-Z)数字(0-9)下划线(_)2.禁止数字开头合法:user_age,...
- python代码实现读取文件并生成韦恩图
-
00、背景今天战略解码,有同学用韦恩图展示各个产品线的占比,效果不错。韦恩图(Venndiagram),是在集合论数学分支中,在不太严格的意义下用以表示集合的一种图解。它们用于展示在不同的事物群组之...
- python学习第二天:用Pycharm新建的第一个程序
-
分享第一次使用Pycharm学到的内容第一次打开得到上面图片projects:项目customize:自定义plugins:插件learn:学习newproject新建项目聪明如我在插件那里找到了汉...
- 如何编写第一个Python程序(python第一个代码)
-
一、第一个python程序[掌握]python:python解释器,将python代码解释成计算机认识的语言pycharm:IDE(集成开发环境),写代码的一个软件,集成了写代码,...
- Python文件读写操作详解:从基础到实战
-
Python文件的读写操作在Python中,文件操作非常常见,可以通过内建的open()函数进行文件的读取、写入、创建等操作。理解文件操作的模式和with语句对于确保代码的简洁性和效率至...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python重命名文件 (54)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)