nginx如何解决超长请求串

nginx是一个强大的http服务器,但是在使用过程中发现,当遇到超长post请求或者get请求时,nginx会返回413、400、414等状态码,这是因为请求串长度超过了nginx默认的缓存大小或者请求串大小,那么我们需要怎么样来解决这些问题呢?

针对POST请求,我们可以调整如下两个配置项来解决:

client_body_buffer_size

语法:client_body_buffer_size the_size

默认值:8k/16k

使用字段:http, server, location

这个指令可以指定连接请求使用的缓冲区大小。

如果连接请求超过缓存区指定的值,那么这些请求或部分请求将尝试写入一个临时文件。

默认值为两个内存分页大小值,根据平台的不同,它可能是8k或16k

client_max_body_size

语法:client_max_body_size size

默认值:client_max_body_size 1m

使用字段:http, server, location

这个指令指定允许客户端请求的最大的单个文件字节数,它出现在请求头部的Content-Length字段。

如果请求大于指定的值,客户端将收到一个"Request Entity Too Large" (413)错误。

需要记住,浏览器并不知道怎样显示这个错误。

同时针对post请求还需要注意下面这个参数的配置,如果不打开这个选项当请求串大于client_body_buffer_size大小时,需要手动去读取存储在磁盘的请求,这里需要注意的是存入磁盘的请求是一个完整的请求并不是大于client_body_buffer_size的部分

client_body_in_single_buffer

语法:client_body_in_single_buffer

默认值:off

使用字段:http, server, location这个指令(0.7.58版本)指定将一个完整的连接请求放入缓冲区,当使用$request_body时推荐使用这个指令以减少复制操作。

如果无法将一个请求放入单个缓冲区,将会被放入磁盘。

针对get请求,我们可以通过修改另外两个配置来解决请求串超长的问题:client_header_buffer_size
语法:client_header_buffer_size size
默认值:1k
使用字段:http, server
这个指令指定客户端请求的http头部缓冲区大小绝大多数情况下一个头部请求的大小不会大于1k不过如果有
来自于wap客户端的较大的cookie它可能会大于1k,Nginx将分配给它一个更大的缓冲区,这个值可以在
large_client_header_buffers里面设置。

large_client_header_buffers
语法:large_client_header_buffers number size
默认值:large_client_header_buffers 4 4k/8k
使用字段:http, server
指令指定客户端请求的一些比较大的头文件到缓冲区的最大值,如果一个请求的URI大小超过这个值,服务
器将返回一个"Request URI too large" (414),同样,如果一个请求的头部字段大于这个值,服务器
将返回"Bad request" (400)。
缓冲区根据需求的不同是分开的。
默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求将状态转换为
keep-alive,这个缓冲区将被释放。

那么有人就会觉得奇怪了,为什么修改http header的大小就能解决get请求串过长的问题呢,
这就要从http协议的get请求说起了,其实GET提交,请求的数据会附在URL之后(就是把数据放置在
HTTP协议头中)。

大家看到没,其实get请求的参数就是存放在http header中的,所以修改header的大小限制
当然可以解决请求串过长的问题啦。此外还有给大家澄清一点啦,HTTP协议没有对传输的数据大小进行限
制,HTTP协议规范也没有对URL长度进行限制,我们日常生活中遇到的长度限制都是各个浏览器或者http
请求工具自己干的。

时间: 2024-10-07 00:13:56

nginx如何解决超长请求串的相关文章

nginx理解--如何处理一个请求

最好的方法是看官方文档,以下内容都是来自官方文档 如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配 1.基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:server { listen 80; server_name example.org www.example.org; ...} server { listen 80; server_name example.net www

记一次通过nginx反代网站请求总是超时的问题

问题描述 公司网站一个页面通过点击"导出数据"来进行数据的导出,后台是通过sql语句进行查询然后再导出为excel文件,因为需要查询数据过多,所以执行起来较慢,每次在等待导出一分钟之后提示网站请求超时. 解决思路 一开始查看了tomcat的连接超时时长,发现时间为20000ms,所以不是tomcat的问题,因为后台是通过nginx反向代理到tomcat,所以就把问题定位到了nginx.然后尝试了keepalive长连接,proxy_send_timeout和proxy_connect_

Nginx+Lua+Redis 对请求进行限制

Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器(Tomcat) 实现思路:通过在Nginx上进行访问限制,通过Lua来灵活实现业务需求,而Redis用于存储黑名单列表. 相关nginx上lua或redis的使用方式可以参考我之前写的一篇文章: openresty(nginx).lua.drizzle调研 http://www.cnblogs.c

nginx源码分析--请求体的读取(1)

首先请求体的读取已经进入了HTTP请求的11个阶段,针对有些模块需要对请求体做一些处理,那么这个模块就需要在这个阶段注册函数,其中读取请求体的函数ngx_http_read_client_request_body()是存在的,只不过不同的模块可能对请求体做不同的处理,读取请全体的函数是在某个模块的conent_handler函数中包含的,比如比如proxy模块,fastcgi模块,uwsgi模块等这些模块对请求体感兴趣,那么读取请求体的函数在这些模块的content_handler中注册. 上节

ios 解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault的问题

解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault. 打印下得到的字典数据: “username”=<null> 此时如果将字典保存到userDefault中会报错 所以需要遍历字典将其替换 for (NSString*s in [Dict1 allKeys]) { if ([Dict1[s] isEqual:[NSNull null]]) { [Dict1 setObject:@""

SpringMVC如何解决POST请求中文乱码问题,GET的又如何处理呢?

在web.xml中 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <pa

nginx源代码分析--读请求主体(1)

首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_body()是存在的.仅仅只是不同的模块可能对请求体做不同的处理.读取请全体的函数是在某个模块的conent_handler函数中包括的.比方比方proxy模块,fastcgi模块,uwsgi模块等这些模块对请求体感兴趣,那么读取请求体的函数在这些模块的content_handler中注冊. 上节说到ng

利用jQuery 解决URL请求参数有中文时出现乱码的问题

利用jQuery 解决URL请求参数有中文时出现乱码的问题 在开发的时候经常会碰到URL中请求参数含有中文的情况,这时如果在前台不作处理,直接在后台利用request.getParameter()拿对应的参数值就会出现中文乱码. 这时可以先利用jQuery对对应中文进行encodeURI(),例子如下: 前台对应代码 <!--省畋无关代码--> <input type="button" id="submitA" value="重发短信&q

Nginx 流量带宽等请求状态统计( ngx_req_status)

Nginx流量带宽等请求状态统计 ( ngx_req_status) 插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git clone https://github.com/zls0424/ngx_req_status.git 配置示例: 1.服务目录 mkdir /opt/server 2.补丁导入: patch -p1 < /opt/server/ngx_req_status/write_filter-VERSION.pa