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

Posted

技术标签:

【中文标题】我在哪里为我的图像设置缓存信息?【英文标题】:Where do I set cache information for my images? 【发布时间】:2019-09-07 12:15:47 【问题描述】:

这是关于Heroku 上的Rails 应用程序,它运行在CloudFront 后面并提供来自Bucketeer 附加组件的ActiveStorage 图像。

Rails 应用程序本身和CloudFront 中的缓存配置都适合cssjs,甚至是关键的重要请求(如搜索结果、从 API 获取的第 3 方信息等) .

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

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

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

这可能吗?

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

我在哪里可以强制这些文件显示缓存指令?

【问题讨论】:

【参考方案1】:

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

另外,我发现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 开发工具包

【讨论】:

这对我不起作用。我的上传是通过rails_admin。这可能有关系吗? @vivipoit 您应该检查您的上传在下面使用了哪个 ActiveStorage 服务。在storage.yml 中应该有一行service: S3(请参阅更新的答案以获取完整内容)如果不是S3,您应该检查所需的ActiveStorage 服务接受哪些选项。服务列表可以在这里找到github.com/rails/rails/tree/6-0-stable/activestorage/lib/… Gems 可以在同一个命名空间下提供自定义服务 即使我说它没有用,我还是把它留在那里,它确实有效。我想我一定是检查了错误的文件。对于那个很抱歉。这很有帮助,非常棒。 我现在期待通过 CDN 提供 Active Storage 文件的可能性,这在无限级别上会很棒,而且似乎已经为 Rails 6.1 做好了准备! :-) 当这成为现实时,很多性能问题都会消失。 :-)【参考方案2】:

经过大量搜索,我了解到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,使用Bucketeer 提供的凭据执行aws configure,然后直接在存储桶中更改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 动作缓存。看一看。如果您有类似的问题,值得一读。

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

【讨论】:

以上是关于我在哪里为我的图像设置缓存信息?的主要内容,如果未能解决你的问题,请参考以下文章

在“缓存”类中,目录设置在哪里?

使用属性值为我的 wordpress 库中的每个图像添加自定义链接

错误 ITMS-900032:“无效的图像路径 -”

tvOS:我们在哪里设置 tvOS 应用商店中显示的应用主题背景图像

我在哪里设置我的 iPhone 应用程序的版本?

RNCamera 拍摄的图像保存在哪里?