天天看點

ngnix下載下傳大檔案逾時問題解決問題描述ngnix配置詳解proxy_buffersproxy_busy_buffers_sizeproxy_max_temp_file_size和proxy_temp_file_write_size解決方法

問題描述

使用ngnix代理web應用,通過頁面下載下傳大檔案時,會産生逾時報錯。

ngnix配置詳解

proxy_buffering:緩存控制開關;

如果禁止緩沖,那麼當Nginx一收到後端的回報就同時傳給用戶端,nginx 不會從被代理的伺服器讀取整個回報資訊。

這個參數用來控制是否打開後端響應内容的緩沖區,如果這個設定為off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令将會失效。 但是無論proxy_buffering是否開啟,對proxy_buffer_size都是生效的。

proxy_buffering開啟的情況下,nignx會把後端傳回的内容先放到緩沖區當中,然後再傳回給用戶端(邊收邊傳,不是全部接收完再傳給用戶端)。 臨時檔案由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定的。如果響應内容無法放在記憶體裡邊,那麼部分内容會被寫到磁盤上。

如果proxy_buffering關閉,那麼nginx會立即把從後端收到的響應内容傳送給用戶端,每次取的大小為proxy_buffer_size的大小,這樣效率肯定會比較低。

nginx不嘗試計算被代理伺服器整個響應内容的大小,nginx能從伺服器接受的最大資料,是由指令proxy_buffer_size指定的.

proxy_buffers

文法: proxy_buffers the_number is_size;

預設值: proxy_buffers 8 4k/8k;

上下文: http, server, location

該指令設定緩沖區的大小和數量,從被代理的後端伺服器取得的響應内容,會放置到這裡. 預設情況下,一個緩沖區的大小等于記憶體頁面大小,可能是4K也可能是8K,這取決于平台。

proxy_buffers由緩沖區數量和緩沖區大小組成的。總的大小為number*size。

若某些請求的響應過大,則超過_buffers的部分将被緩沖到硬碟(緩沖目錄由_temp_path指令指定), 當然這将會使讀取響應的速度減慢, 影響使用者體驗. 可以使用proxy_max_temp_file_size指令關閉磁盤緩沖.

proxy_busy_buffers_size

文法: proxy_busy_buffers_size size;

預設值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if

proxy_busy_buffers_size不是獨立的空間,他是proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完後端響應的時候就開始向用戶端傳送資料,是以它會劃出一部分緩沖區來專門向用戶端傳送資料(這部分的大小是由proxy_busy_buffers_size來控制的,建議為proxy_buffers中單個緩沖區大小的2倍),然後它繼續從後端取資料,緩沖區滿了之後就寫到磁盤的臨時檔案中。

proxy_max_temp_file_size和proxy_temp_file_write_size

臨時檔案由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定。 proxy_temp_file_write_size是一次通路能寫入的臨時檔案的大小,預設是proxy_buffer_size和proxy_buffers中設定的緩沖區大小的2倍,Linux下一般是8k。

proxy_max_temp_file_size指定當響應内容大于proxy_buffers指定的緩沖區時, 寫入硬碟的臨時檔案的大小. 如果超過了這個值, Nginx将與Proxy伺服器同步的傳遞内容, 而不再緩沖到硬碟. 設定為0時, 則直接關閉硬碟緩沖.

解決方法

解決方案:

1)将代理伺服器緩存設定更大,可以直接緩存整個檔案,跟上面的解決一樣

2)禁用代理伺服器緩存:

proxy_buffering off;

3)設定更長的逾時時間

proxy_send_timeout 90; #後端伺服器資料回傳時間(代理發送逾時)

proxy_read_timeout 90; #連接配接成功後,後端伺服器響應時間(代理接收逾時)