欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx 报 upstream sent too big header while reading response header from upstream

程序员文章站 2022-07-12 19:17:59
...

场景:

以Nginx作为代理服务器进行负载均衡处理,发布项目为一个互联网项目,在进行一个接口调用时(此接口为上传Excel并解析,解析的一部分数据会在后端存储到cookie中)。

正常上传Excel是没问题的,但是当Excel中的解析数据多,后来发现是解析数据并存储到cookie中的值多了,这个时候,访问Nginx时,Nginx直接报502错误。

排查原因:

  • 表面现象:

Nginx直接跳转到了502错误界面,浏览器报502gate bad gateway;

  • 日志报错:

查看nginx的log目录下的error文件,报如下错误:

upstream sent too big header while reading response header from upstream

错误处理:

在nginx的配置文件nginx.conf的http块中添加如下配置:

proxy_buffer_size  64k;
proxy_buffers   32 64k;
proxy_busy_buffers_size 128k;

nginx 报 upstream sent too big header while reading response header from upstream

注意:官网上说的这三个参数的作用范围可配置在http、server、location块中,

针对上面的头过大问题,网上有基本上说的都是配置上面3个参数,配置的位置各说不一,http、server、location都有

我自身试过了只有在http块下配置才有效果,在location下配置无效。


参数解释:

Syntax: 	proxy_buffer_size size;
Default: 	proxy_buffer_size 4k|8k;
Context: 	http, server, location
  • proxy_buffer_size

设置Nginx代理服务器从实际服务器接收到响应数据时的缓冲区的大小,默认是4k|8k(根据系统处理),

简单理解:Nginx代理服务器时,在接收到实际服务器的响应时,它会在自身搞出个缓冲区去放置,而这个缓冲区的默认大小是4k或者8k.(后来查了下,我的接口请求的响应大小在28k,远远超出了这个上限)

  • proxy_buffers
Syntax: 	proxy_buffers number size;
Default: 	proxy_buffers 8 4k|8k;
Context: 	http, server, location

 

这个参数设置存储被代理服务器上的数据所占用的buffer的个数和每个buffer的大小。当当前buf不够存响应body时才会新申请一个
  • proxy_busy_buffers_size

nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。

  • proxy_buffering
Syntax: 	proxy_buffering on | off;
Default:        proxy_buffering on;
Context: 	http, server, location

该指令开启从后端被代理服务器的响应body缓冲。
    如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
    如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
    如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
    对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
    但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的。

 

相关标签: Nginx nginx