我在处理大型文件下载/上传(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没有打印或登录任何错误!感谢您的帮助!
答案 0 :(得分:2)
不要使用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
答案 1 :(得分:0)
我遇到了类似的问题,该问题在nginx错误日志文件中通过以下行可见:
<TIMESTAMP> [error] 1221#1221: *913310 upstream prematurely closed connection
while reading upstream, client: <IP>, server: <IP>, request: "GET <URL> HTTP/1.1",
upstream: "http://unix:<LOCAL_DJANGO_APP_DIR_PATH>/run/gunicorn.sock:
<REL_PATH_LOCAL_FILE_TO_BE_DOWNLOADED>", host: "<URL>", referrer: "<URL>/<PAGE>"
这是由文件中的--timeout设置引起的
<LOCAL_DJANGO_APP_DIR_PATH>/bin/gunicorn_start
(found at "command:" in /etc/supervisor/conf.d/<APPNAME>.conf)
在gunicorn_start文件中更改以下行:
exec /usr/local/bin/gunicorn [...] \
--timeout <OLD_TIMEOUT> \
[...]
这被设置为300,我不得不将其更改为1280(以秒为单位!)。 使用〜p可以轻松处理〜5GB的传输,而不会出现RAM问题
django.views.static.serve(request, <LOCAL_FILE_NAME>, <LOCAL_FILE_DIR>