Django + S3 (boto) + Sorl Thumbnail: 优化建议
Posted
技术标签:
【中文标题】Django + S3 (boto) + Sorl Thumbnail: 优化建议【英文标题】:Django + S3 (boto) + Sorl Thumbnail: Suggestions for optimisation 【发布时间】:2011-07-30 14:16:52 【问题描述】:我在我正在开发的 Django 站点中使用 S3 存储后端,以减少来自 EC2 服务器的负载,并允许多个网络服务器(冗余、负载平衡)访问同一组上传的媒体。
我们的模板中使用了 Sorl.thumbnail (v11) 模板标签,以允许灵活地调整图像大小/裁剪。
在富媒体页面上性能不是很好,当第一次访问包含需要生成缩略图的页面时,请求甚至超时。
我知道这是由于 sorl 缩略图检查/从 S3 下载原始图像(可能非常大和高分辨率),并渲染/检查/上传缩略图。
您认为此设置的最佳解决方案是什么?
除了 S3 副本之外,我还看到了存储本地文件副本的建议(当使用多个服务器进行负载平衡时,这不是很好)。我还看到它建议存储 0 字节文件来愚弄 sorl.thumbnail。
还有其他建议或更好的方法来解决这个问题吗?
【问题讨论】:
对于需要在 S3 上使用缩略图的 Flask 用户来说,这是一个提醒。我分叉了flask-thumbnails 并创建了flask-thumbnails-s3。不幸的是,它没有做任何花哨的排队或异步的东西,比如上面链接的各种基于 Django 的解决方案(欢迎贡献!)......但它有效。 【参考方案1】:现在创建sorl 缩略图时考虑了远程慢速存储。然而,缩略图的第一次创建是通过查询存储完成的,例如首先从模板访问,但之后引用被缓存在键值存储中。您仍然需要第一次查询和创建,一个解决方案是在上传图像时使用具有相同选项的低级 api sorl.thumbnail.get_thumbnail。上传图片后,将此缩略图创建作业添加到 celery 之类的 que 中。
【讨论】:
这仍然是该问题的最佳解决方案吗? @sorl 如果生成了密钥库,sorl 缩略图是否仍会访问存储?【参考方案2】:您可以使用Sorlery。它结合了 sorl 和 celery 通过工人创建缩略图。非常小心不要在工作线程之外进行任何文件系统访问。
可以通过将THUMBNAIL_DUMMY_SOURCE
设置为适当的占位符来控制立即返回的缩略图(在工作人员有机会之前)。
第一次请求缩略图时会创建作业,随后的请求将提供虚拟图像,直到工作线程完成。
【讨论】:
我在使用 S3 时所做的完全相同,但我有一个问题。如果我刷新浏览器,则会重复相同的任务,直到缩略图生成完成并缓存。看起来你没有遇到这个问题。但是你会怎么解决呢?似乎 celery 不知道正在重复相同的任务。【参考方案3】:与@Aidan 的解决方案几乎相同,我对 sorl-thumbnail 进行了一些调整。我还用 celery 预先生成缩略图。我的代码在这里sorl_thumbnail-async
但我开始知道easy_thumbnails 完全符合我的要求,所以我在我当前的项目中使用它。您可能会发现有关该主题的有用简短帖子是 here
【讨论】:
最后一个链接是 404'd :(【参考方案4】:到目前为止我发现的最简单的解决方案实际上是这个第三方服务:http://cloudinary.com/
【讨论】:
看起来是一个很酷的服务——可以让python(和其他)应用程序的缩略图生成变得更加容易。感谢您指出!以上是关于Django + S3 (boto) + Sorl Thumbnail: 优化建议的主要内容,如果未能解决你的问题,请参考以下文章
django-storages + sorl_thumbnail + S3 不能很好地协同工作(URL 不匹配)
Django-storages + boto + S3 collectstatic 的最小凭据
升级到 Django 1.7。出现错误:无法序列化:<storages.backends.s3boto.S3BotoStorage 对象
使用带有 Compressor 的 Boto 的 Django AWS S3 无法压缩 UncompressableFileError