天天看點

upstream timed out

報錯資訊:

1

<code>2015</code><code>/06/29</code> <code>12:16:50 [error] 2612</code><code>#0: *24 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.1.167, server: www.linkymall.com, request: "POST /back/shopinfo/importProduct.action?isFalg=se HTTP/1.1", upstream: "http://192.168.1.189:8002/back/shopinfo/importProduct.action?isFalg=se", host: "www.linkymall.com", referrer: "http://www.linkymall.com/back/shopinfo/gotoShopInfoPage.action"</code>

解決辦法:

server {

        listen       80;

        server_name  *.xywy.com ;

        large_client_header_buffers 4 16k;

        #客戶請求頭緩沖大小 nginx預設會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取如果設定過小HTTP頭/Cookie過大 會報400 錯誤 nginx 400 bad request求行如果超過buffer,就會報HTTP 414錯誤(URI Too Long)nginx接受最長的HTTP頭部大小必須比其中一個buffer大,否則就會報400的HTTP錯誤(Bad Request)。

        client_max_body_size 300m;

#指令指定允許用戶端連接配接的最大請求實體大小,它出現在請求頭部的Content-Length字段. 如果請求大于指定的值,用戶端将收到一個"Request Entity Too Large" (413)錯誤. 記住,浏覽器并不知道怎樣顯示這個錯誤.

        client_body_buffer_size 128k;

這個指令可以指定連接配接請求實體的緩沖區大小。

如果連接配接請求超過緩存區指定的值,那麼這些請求實體的整體或部分将嘗試寫入一個臨時檔案。

預設值為兩個記憶體分頁大小值,根據平台的不同,可能是8k或16k。

當請求頭中的Content-Length字段小于指定的buffer size,那麼Nginx将使用較小的一個,是以nginx并不總是為每一個請求配置設定這個buffer size大小的buffer。        

        proxy_connect_timeout 600;

說明 該指令設定與upstream server的連接配接逾時時間,有必要記住,這個逾時不能超過75秒。

這個不是等待後端傳回頁面的時間,那是由proxy_read_timeout聲明的。如果你的upstream伺服器起來了,但是hanging住了(例如,沒有足夠的線程處理請求,是以把你的請求放到請求池裡稍後處理),那麼這個聲明是沒有用的,由于與upstream伺服器的連接配接已經建立了。        

        proxy_read_timeout 600;

說明 該指令設定與代理伺服器的讀逾時時間。它決定了nginx會等待多長時間來獲得請求的響應。這個時間不是獲得整個response的時間,而是兩次reading操作的時間。

        proxy_send_timeout 600;

說明 這個指定設定了發送請求給upstream伺服器的逾時時間。逾時設定不是為了整個發送期間,而是在兩次write操作期間。如果逾時後,upstream沒有收到新的資料,nginx會關閉連接配接

        proxy_buffer_size 64k;

該指令設定緩沖區大小,從代理後端伺服器取得的第一部分的響應内容,會放到這裡.

小的響應header通常位于這部分響應内容裡邊.

預設來說,該緩沖區大小等于指令 proxy_buffers所設定的;但是,你可以把它設定得更小.

        proxy_buffers   4 32k;

該指令設定緩沖區的大小和數量,從被代理的後端伺服器取得的響應内容,會放置到這裡. 

        proxy_busy_buffers_size 64k;

預設值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if

TODO: Description.

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

        proxy_temp_file_write_size 64k;

一次通路能寫入的臨時檔案的大小,預設是proxy_buffer_size和proxy_buffers中設定的緩沖區大小的2倍,Linux下一般是8k。

         ........................

 }

本文轉自 xinsir999 51CTO部落格,原文連結:http://blog.51cto.com/xinsir/1668984,如需轉載請自行聯系原作者

繼續閱讀