nginx+tomcat 报错:『an upstream response is buffered to a temporary file 』

1、过程描述:php

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

查看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”】python

2、经研究得知:nginx

一、是由于nginx默认的buffer过小,请求头header太大时会出现缓存不足,写入到了磁盘中,形成访问中断。后端

二、进而联系前端得知前端为了SEO,在header中加入和很多的中文词汇,header那叫一个大。。。缓存

3、解决办法:tomcat

由于nginx+tomcat中,nginx作的proxy,就是反向代理,因此在nginx+tomcat模式中,修改fastcgi_buffer_* 是无效的,须要修改proxy对应的buffer大小。服务器

一、对于( php | python )+nginx的能够设置为:app

fastcgi_buffer_size 512k;

fastcgi_buffers 6 512k;

fastcgi_busy_buffers_size 512k;

fastcgi_temp_file_write_size 512k;


二、对于tomcat+nginx的能够设置为:

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

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

proxy_buffers 100  128k;     #

client_max_body_size 100m;

对于实际修改的大小,须要按实际状况来。


3、网上查询的原理:

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数量的。

相关文章
相关标签/搜索