通过MongoDB的GridFS提供静态文件

时间:2014-11-16 16:39:33

标签: python django mongodb static-content

我是Django的新手,我正在尝试在OpenShift上部署一个小型的业余爱好项目。我知道有些约定建议不要让Django提供静态和媒体文件,因为它效率低下。我还注意到,当DEBUG关闭时,Django拒绝提供媒体文件。这就是为什么我正在寻找更好的方式来提供这些内容。

Django的文档认为像Amazon S3这样的CDN是静态服务的最佳方式之一,但作为业余爱好者,我现在宁愿坚持使用免费增值解决方案。我发现MongoDB--我不太常用的另一项技术 - 提供GridFS作为存储后端。我可以通过MongoLab获得免费的MongoDB存储空间,所以这对我来说很有意思。

这样的建筑会在实践中运作还是这种疯狂的谈话?如果这是可行的,我需要对我的OpenShift环境和Django设置进行哪些更改才能让GridFS提供静态内容?我见过人们使用CloudFlare's free CDN来提供静态内容的替代设置,但后来我无法从本地开发环境上传/访问媒体文件。

1 个答案:

答案 0 :(得分:0)

长话短说:这是一个坏主意。

原因如下:为了提供静态文件,您首先需要处理请求,从GridFS获取数据,这实际上将文件分散为255k块,这些块必须被收集(取决于大小,当然)只有这样才能归还。

我倾向于使用varnish来缓存应用程序所服务的静态文件,无论是django还是Servlet容器。这样的工作方式如下:

  1. 所有请求都发送到varnish,varnish从缓存或手中提供请求的资源,然后再发送到后端。
  2. Varnish使用您的django应用程序作为后端。不过,我通常会在额外的lighttpd后面运行django。
  3. 当django返回静态文件时,varnish将此文件放入内存缓存区域。我通常会为此分配100M - 有时甚至更少。您应该熟知静态文件的大小。我倾向于做一个简单的缓存配置,比如“缓存所有以.css,.js,.png结尾的文件”。
  4. 此静态资源的所有后续请求现在将由varnish提供 - 从内存,通过sendfile系统调用,甚至不会到达后端。
  5. 总而言之:这样,从您的应用程序中获取负载,减少延迟,快速交付资源,无需任何编程工作即可轻松设置。

    编辑:对于OpenShift环境:只需保持原样。从MongoDB提供静态文件根本没有意义。