nginx如何解决超长请求串

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

针对POST请求,咱们能够调整以下两个配置项来解决:缓存

client_body_buffer_size服务器

语法:client_body_buffer_size the_sizecookie

默认值:8k/16k工具

使用字段:http, server, locationpost

这个指令能够指定链接请求使用的缓冲区大小。学习

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

默认值为两个内存分页大小值,根据平台的不一样,它多是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 请求工具本身干的。

 

持续学习、持续收获才能带来持续的知足和快乐!

转载于:https://my.oschina.net/u/3367404/blog/1808954