Nginx下載大文件失敗

原因分析:
nginx代理nginx時,前端用戶請求下載文件, nginx代理會先從後端nginx拿到文件並緩存到本地,然後響應給客戶端,其中與proxy buffer相關的配置項如下:
proxy_buffer_size 512k;
proxy_buffers 4 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
由此可知, buffer緩衝區最大可以緩衝2.5M的數據,然後就開始刷寫磁盤,如果磁盤無法寫入,數據丟失。這也是爲什麼前端下載部分數據,即下載不動的原因。

原因分析:
 1)代理服務器報告:上游過早的關閉連接,好像問題出在被代理服務器;而被代理服務器則抱怨:上游服務器超時。那麼一個很合理的推論是:代理服務器很長時間沒向被代理服務器請求數據,被代理服務器認爲代理服務器已經掉線或完成任務,於是主動斷開連接,代理服務器發現需要數據,再連接時,已經連接不上了。
 2)正常的流程應該是:只要客戶端一直下載,“客戶機->代理服務器->被代理服務器”,這一連串的數據流不會中斷,也就不會出現超時。
 3)出現超時只能有一種情況:代理服務器緩存了大文件。
 4)代理服務器接到下載請求,向被代理服務器請求數據,由於兩個服務器之間網速快,所以代理服務器請求速度要遠大於向客戶端發送的速度,這就導致一下正常的代理方式:代理服務器要緩存數據。
 5)但是兩個服務器之間的速度實在是太快了,緩存1G數據也就是分分鐘的事情,而客戶端需要慢慢下載,可能需要十幾、甚至幾十分鐘。代理服務器和被代理服務器這段時間內沒有什麼事可幹,與是兩端靜默的時間一長,超過了timeout的時間(一般是60s),被代理服務器就認爲代理服務器掉線。
解決方案:
1)將代理服務器緩存設置更大,可以直接緩存整個文件,跟上面的解決一樣
2)禁用代理服務器緩存:
proxy_pass http://192.168.0.1;
proxy_redirect default;
proxy_buffering off;
3)設置更長的超時時間
proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
proxy_read_timeout 90; #連接成功後,後端服務器響應時間(代理接收超時)

原文地址:https://www.cnblogs.com/breezey/p/6740229.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章