4

我们最近搬到了 Heroku avec,我们决定将我们的资产存储在 Amazon S3 上,并使用 Cloudfront 发行版。

我使用 Django Pipeline 来压缩/编译我的资产,但我没有设法让它指向正确的版本。当我运行“collectstatic”管理命令时,它运行良好:

后处理“css/compress_profile_school.css”为“css/compress_profile_school.82973855aca5.css”后处理“css/compress_profile.css”为“css/compress_profile.d120536e24f9.css”后处理“css/compress_document.css”为“ css/compress_document.864dd7603769.css ...

但是当我运行该应用程序时,它没有指向正确的版本(它使用没有哈希的版本)。

该应用程序在此处运行:http: //dev.unishared.com/

似乎 Django 捆绑的静态文件应用程序也无法指向正确的版本。

每次我推送新的资产版本时,我都必须使我的 Cloudfront 发行版失效,这需要时间..

谢谢你的帮助。

4

3 回答 3

1

不要 setup PIPELINE_STORAGE,除非你真的知道自己在做什么,否则 setup STATICFILES_STORAGE。请参阅存储文档

于 2013-01-27T12:23:50.633 回答
1

多亏了cyberdelia,我设法让它工作了。

首先,“CachedFilesStorage”仅在您的 DEBUG 设置关闭(= False)时将 hashname 放在文件名中。它在我的生产服务器上运行良好。

从这里开始,“collectstatic”命令正在 S3 上上传正确的文件(名称中带有哈希)。我遇到了第二个问题:缓存的 URL 指向 S3 存储桶,而不是“STATIC_URL”设置中定义的 Cloudfront。我认为这与我的自定义存储使用的 django-storages / boto 有关,它适用于 S3 而不是 Cloudfront:

class S3PipelineStorage(PipelineMixin, CachedFilesMixin, StaticStorage):
pass

(静态存储是一个 S3BotoStorage 子类,其位置设置为“静态”)。

现在,我必须找到一种方法让它在 Cloudfront 而不是 S3 上正常工作。

谢谢你的帮助!

编辑:

我想通过这篇文章让它工作:Django-compressor: how to write to S3, read from CloudFront?

当您定义“自定义域”键时,它将使用 Cloudfront 域而不是 Amazon S3。

我忘了提到我必须将 AWS_QUERYSTRING_AUTH 设置为 False 才能使其正常工作。

于 2013-01-29T18:21:02.307 回答
0

您的情况可能会有所不同,但通常最好不要使用 S3 提供此内容。

摘自白噪声文档

我不应该使用 Django-Storages 之类的东西将我的静态文件推送到 S3 吗?

不,你不应该。这种方法的主要问题是 Amazon S3 目前无法有选择地向您的用户提供 gzip 压缩的内容。Gzipping 可以显着减少 CSS 和 JavaScript 所需的带宽。但是,尽管当今使用的所有浏览器都可以解码 gzip 压缩的内容,但您的用户可能会使用无法正确处理 gzip 压缩内容的蹩脚的公司代理或防病毒扫描程序。Amazon S3 强制您选择是不向任何人(浪费带宽)或所有人(冒您的网站因某些用户中断的风险)提供压缩内容。

……剪……

处理静态文件的基于推送的方法的第二个问题是它增加了部署过程的复杂性和脆弱性:特定于存储后端的额外库、额外的配置和身份验证密钥以及必须在特定点运行的额外任务部署以使一切正常工作。

我使用 django-pipelines 在部署时加入和缩小我的内容,使用白噪声来提供静态内容,并使用 Cloudfront CDN 进行缓存。

我遵循了这个如何开始。

这也意味着我只为 CDN 点击付费,而不是 CDN + S3。

于 2015-12-15T23:58:24.117 回答