微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NGinx和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秒)

PS:有人已经指出我的问题是Django,但我还没弄清楚原因. Django没有打印或登录任何错误

谢谢你的帮助!

解决方法:

不要使用django来提供静态内容,特别是当它的静态内容与此一样大时. Nginx非常适合提供它们.您需要做的就是在Nginx配置文件中创建一个这样的映射:

location /static/ {
     try_files $uri =404 ;
     root /var/www/myapp/;
     gzip on;
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+RSS text/javascript;

}

/ var / www / myapp /是django应用程序的顶级文件夹.在里面你将有一个名为static /的文件夹,你需要使用django manage.py的collectstatic命令收集所有静态文件.

当然,您可以随意重命名这些文件夹,并一起使用不同的文件结构.有关如何在此链接上为静态内容配置Nginx的更多信息:http://nginx.org/en/docs/beginners_guide.html#static

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐