在哪里为图像设置缓存信息?

时间:2019-04-17 09:30:32

标签: ruby-on-rails heroku amazon-cloudfront

这是关于Rails上的Heroku应用,该应用在CloudFront后面运行,并提供来自ActiveStorage插件的Bucketeer图像。

Rails应用程序本身和CloudFront中的

缓存配置正适合cssjs甚至关键的重要请求(例如搜索结果,第3个从API等获取的参与方信息。

我不知道如何缓存来自Bucketeer附件的图像。

现在,图像似乎每次都来自Bucketeer存储桶。它们显示时没有缓存TTL。

我希望在CloudFront级别和访问者的浏览器级别将它们缓存长达一年。

这可能吗?

似乎Bucketeer插件本身使我们无法控制存储桶和/或服务如何处理缓存。

在哪里可以强制这些文件显示缓存说明?

2 个答案:

答案 0 :(得分:0)

经过大量搜索,我了解到Bucketeer确实可以控制存储区。您只需要使用AWS CLI

以下是AWSCLI个文档的链接: 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,使用aws configure提供的凭据进行Bucketeer,然后直接在存储桶中更改cache-control

AWS似乎没有为整个存储桶或文件夹设置cache-control默认值的功能,因此实际上是对每个对象进行设置。

就我而言,存储桶中的所有文件/对象都是我在网站上显示并需要缓存的图像,因此可以安全地运行一次完成所有操作的命令。

可以在此答案中找到这样的命令: How to set expires headers to all images in a bucket in Amazon 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操作缓存。看一看。如果您遇到类似的问题,则值得一读。

有缺点。就我而言,这不是问题,所以这就是我所采用的解决方案。

答案 1 :(得分:0)

感谢您在这里分享您的发现

此外,我发现S3Service接受上传选项 https://github.com/rails/rails/blob/6-0-stable/activestorage/lib/active_storage/service/s3_service.rb#L12

因此,您可以将以下代码添加到storage.yml

s3:
  service: S3
  access_key_id: ID
  secret_access_key: KEY
  region: REGION
  bucket: BUCKET
  upload:
    cache_control: 'public, max-age=31536000'

有关可用选项的完整列表,请参阅AWS开发工具包