ruby-on-rails - Rails ActiveStorage : how to avoid one redirect for each image?

标签 ruby-on-rails amazon-s3 rails-activestorage ruby-on-rails-6

如果你使用 ActiveStorage 并且你有一个包含 N 个图像的页面,你会收到 N 个额外的 Rails 应用请求(即 N 个重定向)。如果您在一个页面上有数十个图像,这意味着浪费大量的服务器资源。

我知道重定向对签名 URL 很有用。但是我想知道为什么 Rails 不预先计算最终的签名 URL 并将其嵌入到 HTML 页面中……这样我们可以保持签名 URL/ protected 文件的优势,而无需对 Rails 服务器进行 N 次额外调用。

是否可以直接在 HTML 中包含图像变体的最终 URL/预签名 URL(从而避免重定向)?否则,为什么不可能呢?

最佳答案

经过几天的推理和测试,我对我的最终解决方案感到非常兴奋,我将在下面解释。这是一种固执己见的图像处理方法,可能并不代表当前的 Rails Way™️,但是对于提供许多公共(public)图像的网站来说,它具有难以置信的优势,特别是:

  • 当您为包含 N 个图像的页面提供服务时,您不会收到 1 + N 个对应用服务器的请求,相反,您只会收到对页面
  • 的 1 个请求
  • 图片通过 CDN 提供,这可以缩短加载时间
  • 存储桶不是完全公开的,而是受 Cloudflare
  • 保护
  • 图片由 Cloudflare 缓存,大大减少您的 S3 费用
  • 您将 API 请求的数量(即存在)大大减少到 S3
  • 此解决方案不需要对 Rails 进行大的更改,因此在出现问题时可以直接切换回 Rails 默认行为

  • 这是解决方案:
  • 创建一个 s3 存储桶并将其配置为 host a public website (即称之为 storage.example.com ) - 您甚至可以禁用存储桶级别的公共(public)访问,并使用存储桶策略仅允许访问 Cloudflare ips
  • 转到 Cloudflare 并为 storage.example.com 配置 CNAME指向您的域;您需要使用灵活 SSL(您可以为子域使用页面规则);使用页面规则设置重缓存:设置 Cache Everything 并为 Browser Cache TTL 和 Edge Cache TTL
  • 设置一个非常长的值(例如 1 年)
  • 在您的 Rails 应用程序中,您可以继续使用私有(private)存储/acl,这是默认的 Rails 行为
  • 在您的 Rails 应用程序中调用 @post.variant(...).processed每次更新或创建 @post 后;然后在您的意见中使用 'https://storage.example.com/' + @post.variant(...).key' (请注意,我们不会在 View 中调用 processed 以避免在 s3 中进行额外检查);你也可以有一个调用 processed 的 rake 任务。在每个对象上,以防您需要重新生成变体;如果您只有几个不经常更改的变体(例如每个帖子 1 个图像/变体),这将非常有效

  • 上述大部分步骤都是可选的,因此您可以根据需要将它们组合起来。

    关于ruby-on-rails - Rails ActiveStorage : how to avoid one redirect for each image?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59013049/

    相关文章:

    ruby-on-rails - 如何安装和使用 Ruby on Rails 金属生成器?

    ruby-on-rails - 如何通过 HTTParty 通过 PUT 请求发送空数组?

    ios - 无法使用解析服务器将大文件保存到 S3

    ruby-on-rails - 无法使用 minimagick Rails 打开事件存储图像附件

    javascript - rails : Capturing error messages in JavaScript

    javascript - 当子类化 Ruby 内置函数时会发生哪些类型的明显问题?

    php - 如何将 Amazon s3 用作 Codeigniter 库?

    Django + S3 (boto) + Sorl 缩略图 : Suggestions for optimisation

    ruby-on-rails - has_one_attached 时的默认附件

    ruby-on-rails - ActiveStorage-Safari缓存的附件