nginx+tomcat 报错:『an upstream response is buffered to a temporary file 』
admin
2023-03-17 11:01:23
0

一、过程描述:

访问新项目网站发现有静态资源获取failed,图片经常无法显示,刷新偶尔图片能显示出来。

查看nginx日志,有error.log报错:

【2017/07/21 22:53:12 [warn] 22402#0: *484 an upstream response is buffered to a temporary file /var/tmp/nginx/proxy//6/01/0000000016 while reading upstream, client: xxx.xxx.xxx.xxx, server: wap.xxxxxxxxx.com, request: "GET /source/p_w_picpaths/applyfristbg.jpg HTTP/1.1", upstream: "http://127.0.0.1:8081/source/p_w_picpaths/applyfristbg.jpg", host: "wap.xxxxxxxxx.com", referrer: "http://wap.xxxxxxxxx.com/source/css/apply-first-7ae1ca00a910468d350b293787c7e95dfbebd675.css”】

二、经研究得知:

1、是因为nginx默认的buffer太小,请求头header太大时会出现缓存不足,写入到了磁盘中,造成访问中断。

2、进而联系前端得知前端为了SEO,在header中加入和不少的中文词汇,header那叫一个大。。。

三、解决办法:

因为nginx+tomcat中,nginx做的proxy,就是反向代理,所以在nginx+tomcat模式中,修改fastcgi_buffer_* 是无效的,需要修改proxy对应的buffer大小。

1、对于( php | python )+nginx的可以设置为:

fastcgi_buffer_size 512k;

fastcgi_buffers 6 512k;

fastcgi_busy_buffers_size 512k;

fastcgi_temp_file_write_size 512k;


2、对于tomcat+nginx的可以设置为:

proxy_buffering    off;     #开启从后端被代理服务器的响应内容缓冲

proxy_buffer_size  128k;     #设置缓冲区的大小和数量

proxy_buffers 100  128k;     #

client_max_body_size 100m;

对于实际修改的大小,需要按实际情况来。


三、网上查询的原理:

buffer工作原理

首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。

在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。

一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。


相关内容

热门资讯

ICC逮捕令致内塔尼亚胡出行受... 【环球网报道】据以色列《新消息报》网站26日报道,由于国际刑事法院(ICC)2024年就以色列在巴勒...
“罗永浩怒斥电视机厂商”戳中了... 7月25日晚,罗永浩发文怒斥当下电视机的产品设计。据都市快报报道,罗永浩表示,他为家中老人换了两次电...
各地各部门坚持人民至上筑牢防汛... 新华社北京7月25日电 题:风雨同舟映初心——各地各部门坚持人民至上筑牢防汛抗洪坚实堤坝新华社记者当...
法院回应LV起诉地产开发商 7月26日,厦门市湖里区人民法院发布情况通报,网传案情“路易威登公司起诉地产开发商,因楼盘外立面四叶...
携程的问题不仅在于垄断,更在于... 国内平台科技企业一般都是通过向B端收费、抽佣获利,尽量给消费者创造一个比较清爽的使用环境。携程算是最...
海信电视用遥控器关闭后打不开 原因可能是遥控器的电池没有装好或者是没电了,需要重新安装一下电池或者更换新的电池试一试;原因可能是电...
电视机突然没电源打不开了 有可能是电视开关的电源线断了;可能是电视在使用时短路;可能是电源插头插座松动;可能是电视内部零件接触...
电热水器下面那个小龙头漏水是怎... 电热水器下面那个小龙头漏水是怎么回事?1、因为安全阀发生了故障或者是已经被损坏了,就会有漏水的现象;...
回答下电脑桌面一片空白怎么恢复 电脑桌面上如果是一片空白,那说明您的电脑图标被隐藏了,想要恢复就要按照如下的三个步骤去操作才行。 第...
澳总理要找特朗普“理论”关税:... 当地时间7月26日,澳大利亚总理阿尔巴尼斯表示,他将直接向美国总统特朗普提出抗议,反对美国新近宣布的...