NGinx& Django,提供大文件(3gb +)

时间:2015-09-04 09:56:32

标签: nginx django

这个问题已经回答here

我在处理大型文件下载/上传(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 个答案:

答案 0 :(得分:2)

对于大文件,尝试将NGINX本身与X-Accel一起使用。 NGINX旨在为静态内容提供服务,而Django则用于应用程序逻辑。

了解更多信息 NGINX X-Accel Wikithis answer

答案 1 :(得分:-1)

来自nginx的错误表明上游关闭了连接,因此它是django的问题。我建议在django日志中查找错误和调试信息。