我该在哪里设置我的图片缓存信息?

4
这是有关在Heroku上运行的Rails应用程序,其在CloudFront后面运行,并从Bucketeer附加组件提供ActiveStorage图像的内容。
对于css,js和甚至关键的重要请求(例如从API获取的搜索结果、第三方信息等),Rails应用程序本身和CloudFront中的缓存配置都非常准确。
我无法弄清楚如何缓存来自Bucketeer附加组件的图像。
现在,这些图像似乎每次都来自Bucketeer存储桶。它们没有任何缓存TTL。
我希望将它们在CloudFront级别和访问者的浏览器级别上缓存长达一年。
这可能吗?
似乎Bucketeer附加组件本身并不会让我们控制存储桶和/或服务处理缓存的方式。
我该在哪里强制这些文件显示缓存指令?
2个回答

6

这对我没有用。我的上传是通过rails_admin完成的。这可能有关吗? - vivipoit
你应该检查你的上传使用了哪个ActiveStorage服务。 在storage.yml中应该有一行service: S3(完整内容请参见更新后的答案)如果不是S3,您应该检查期望的ActiveStorage服务接受哪些选项。服务列表可以在此处找到 https://github.com/rails/rails/tree/6-0-stable/activestorage/lib/active_storage/serviceGems可能会在相同命名空间下提供自定义服务 - Alex Suslyakov
尽管我说它没有起作用,但我把它留在那里,现在它确实可以工作了。我想我可能检查了错误的文件。对此感到抱歉。这很有帮助,非常棒。 - vivipoit
我现在非常期待通过CDN提供Active Storage文件的可能性,这将在无限层面上变得非常棒,并且似乎已经为Rails 6.1准备就绪!! :-) 当这成为现实时,许多性能问题都将消失。 :-) - vivipoit

2
经过大量搜索,我了解到Bucketeer确实提供了存储桶控制。你只需要使用AWS CLI即可。
这里是AWS关于CLI的文档链接: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html 这里是Bucketeer告诉你如何在他们的服务上开始使用的链接: https://devcenter.heroku.com/articles/bucketeer#using-with-the-aws-cli 这意味着你可以安装AWS CLI,使用Bucketeer提供的凭据进行aws configure,并直接更改存储桶中的cache-control。
AWS似乎没有为整个存储桶或文件夹设置cache-control默认值的功能,因此您需要对每个对象进行更改。
在我的情况下,存储桶中的所有文件/对象都是我在网站上显示并需要缓存的图像,因此可以安全地运行一个命令来一次性完成所有操作。
这个答案中可以找到这样一个命令:如何在亚马逊S3存储桶中为所有图像设置过期标头 对于我来说,它看起来像这样:aws s3 cp s3://my-bucket-name s3://my-bucket-name --recursive --acl public-read --metadata-directive REPLACE --cache-control max-age=43200000 该命令基本上将整个存储桶复制到自身,同时在处理每个对象时添加了“cache-control max-age = 43200000”标头。
这适用于所有现有文件,但不会改变未来的更改或添加。您必须定期再次运行此操作以捕获新内容和/或编写代码来在将对象保存到存储桶时设置您的对象标头。显然有些人做到了这一点,但我没有。
幸运的是,我找到了这篇文章: https://www.neontsunami.com/posts/caching-variants-with-activestorage 这个猴子补丁基本上改变了ActiveStorage::RepresentationsController#show,使用Rails动作缓存来处理变量。看一下。如果你遇到类似的问题,这篇文章值得一读。
有一些缺点。对于我的情况,它们不是问题,所以这就是我选择的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接