我在提供大文件下载/上传(3GB+)时遇到一些问题。
由于我使用的是 Django,我猜想提供文件的问题可能来自 Django 或 NGinx。
在我启用 NGinx 的网站中,我有
server {
...
client_max_body_size 4G;
...
}
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
这种方法允许我从 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/"
Run Code Online (Sandbox Code Playgroud)
阅读了一些文章后,我将以下内容添加到我的 NGinx 配置中:
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
Run Code Online (Sandbox Code Playgroud)
*1但我用 an而不是 a得到了同样的错误*553*
我还认为这可能是Django数据库超时,所以我添加了:
DATABASE_OPTIONS = {
'connect_timeout': 14400,
}
Run Code Online (Sandbox Code Playgroud)
但它也不起作用。(通过开发服务器下载大约需要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;
Run Code Online (Sandbox Code Playgroud)
}
作为/var/www/myapp/django 应用程序的顶级文件夹。在里面你将有一个名为的文件夹static/,您需要使用 django manage.py 的collectstatic 命令收集所有静态文件。
当然,您可以随意重命名这些文件夹,并一起使用不同的文件结构。有关如何为静态内容配置 nginx 的更多信息,请访问此链接:http://nginx.org/en/docs/beginners_guide.html#static
| 归档时间: |
|
| 查看次数: |
2915 次 |
| 最近记录: |