問題描述
使用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; #連接配接成功後,後端伺服器響應時間(代理接收逾時)