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

相關文章
相關標籤/搜索