一、過程描述:
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的涵江網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
訪問新項目網(wǎng)站發(fā)現(xiàn)有靜態(tài)資源獲取failed,圖片經(jīng)常無法顯示,刷新偶爾圖片能顯示出來。
查看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”】
二、經(jīng)研究得知:
1、是因為nginx默認的buffer太小,請求頭header太大時會出現(xiàn)緩存不足,寫入到了磁盤中,造成訪問中斷。
2、進而聯(lián)系前端得知前端為了SEO,在header中加入和不少的中文詞匯,header那叫一個大。。。
三、解決辦法:
因為nginx+tomcat中,nginx做的proxy,就是反向代理,所以在nginx+tomcat模式中,修改fastcgi_buffer_* 是無效的,需要修改proxy對應(yīng)的buffer大小。
1、對于( php | python )+nginx的可以設(shè)置為:
fastcgi_buffer_size 512k;
fastcgi_buffers 6 512k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
2、對于tomcat+nginx的可以設(shè)置為:
proxy_buffering off; #開啟從后端被代理服務(wù)器的響應(yīng)內(nèi)容緩沖
proxy_buffer_size 128k; #設(shè)置緩沖區(qū)的大小和數(shù)量
proxy_buffers 100 128k; #
client_max_body_size 100m;
對于實際修改的大小,需要按實際情況來。
三、網(wǎng)上查詢的原理:
首先第一個概念是所有的這些proxy buffer參數(shù)是作用到每一個請求的。每一個請求會安按照參數(shù)的配置獲得自己的buffer。proxy buffer不是global而是per request的。
proxy_buffering 是為了開啟response buffering of the proxied server,開啟后proxy_buffers和proxy_busy_buffers_size參數(shù)才會起作用。
無論proxy_buffering是否開啟,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所設(shè)置的buffer_size的作用是用來存儲upstream端response的header。
在proxy_buffering 開啟的情況下,Nginx將會盡可能的讀取所有的upstream端傳輸?shù)臄?shù)據(jù)到buffer,直到proxy_buffers設(shè)置的所有buffer們被寫滿或者數(shù)據(jù)被讀取完(EOF)。此時nginx開始向客戶端傳輸數(shù)據(jù),會同時傳輸這一整串buffer們。同時如果response的內(nèi)容很大的話,Nginx會接收并把他們寫入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer傳輸完了會從temp_file里面接著讀數(shù)據(jù),直到傳輸完畢。
一旦proxy_buffers設(shè)置的buffer被寫入,直到buffer里面的數(shù)據(jù)被完整的傳輸完(傳輸?shù)娇蛻舳耍?,這個buffer將會一直處在busy狀態(tài),我們不能對這個buffer進行任何別的操作。所有處在busy狀態(tài)的buffer size加起來不能超過proxy_busy_buffers_size,所以proxy_busy_buffers_size是用來控制同時傳輸?shù)娇蛻舳说腷uffer數(shù)量的。