2015-09-04 49 views
1

已回答此問題hereNGinx&Django,提供大文件(3GB +)


我在服務大文件下載/上傳(3gb +)時遇到了一些問題。

因爲我使用的是Django,我猜服務器端文件的問題可能來自Django或NGinx。

在我的Nginx啓用的網站我有

server { 
    ... 
    client_max_body_size 4G; 
    ... 
} 

而且隨着Django的,我服務於數據塊中的文件大小:

def return_file(path): 
     filename = os.path.basename(path) 
     chunk_size = 8192 
     response = StreamingHttpResponse(FileWrapper(open(path), chunk_size), content_type=mimetypes.guess_type(path)[0]) 
     response['Content-Length'] = os.path.getsize(path)  
     response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) 
     return response 

這種方法讓我從600MB〜下載到通2.6Gb,但似乎下載在2.6Gb被截斷。我跟蹤誤差:

2015/09/04 11:31:30 [error] 831#0: *553 upstream prematurely closed connection while reading upstream, client: 127.0.0.1, server: localhost, request: "GET /chat/download/photorec.zip/ HTTP/1.1", upstream: "http://unix:/web/rsmweb/run/gunicorn.sock:/chat/download/photorec.zip/", host: "localhost", referrer: "http://localhost/chat/2/" 

閱讀一些帖子後,我增加了以下我的Nginx的conf:

proxy_read_timeout 300; 
    proxy_connect_timeout 300; 
    proxy_redirect off; 

但我買了一個*1代替*553*

我同樣的錯誤也認爲它可能是一個Django數據庫超時,所以我補充說:

DATABASE_OPTIONS = { 
    'connect_timeout': 14400, 
} 

但它也不起作用。 (通過開發服務器下載大約需要30秒)

感謝您的幫助!

回答

2

對於大型文件,嘗試使用NGINX本身X-Accel。 NGINX旨在服務於靜態內容,而Django則用於您的應用程序邏輯。

欲瞭解更多信息 NGINX X-Accel Wikithis answer

-1

來自nginx的錯誤表明上游關閉了連接,所以這是django的問題。我建議在django日誌中查找錯誤和調試信息。

+0

我會盡量找到django的問題,但它不是登錄/顯示任何錯誤! – rsm

+0

然後你需要做一些調試。我不是一個Python程序員,也不是一個編程問答網站,所以我沒有更多的幫助。 – womble

+0

我以爲這是ServerFault的問題,而不是S.O,因爲它幾乎與「服務器設置」有關,但是感謝您指出它,並感謝您的幫助! – rsm