nginx 报 upstream sent too big header while reading response header from upstream
场景:
以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;
注意:官网上说的这三个参数的作用范围可配置在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实现反向代理和负载均衡
推荐阅读
-
Centos7---nginx---upstream prematurely closed connection while reading response header from upstream
-
nginx 报 upstream sent too big header while reading response header from upstream
-
「recv() failed while reading response header from upstream」
-
502 upstream sent too big header while reading response header from upstream
-
502 upstream sent too big header while reading response header from upstream