【问题标题】:Possible to use an Amazon S3 bucket for the /public directory in a Heroku Rails app?可以在 Heroku Rails 应用程序中为 /public 目录使用 Amazon S3 存储桶吗?
【发布时间】:2012-12-14 02:53:21
【问题描述】:

我正试图弄清楚如何在可能的几个 Heroku dynos 之间共享一堆 (读取:数千) 静态 HTML 文件。

显然,dynos 将具有单独的文件系统(更不用说它们是短暂的),因此那里似乎没有可行的解决方案。

生成这些页面会相当昂贵(并且可能会发生变化),所以我不想在每个测功机上频繁生成。

有没有办法设置 Rails/Heroku 在 S3 存储桶中查找 /public 目录?我不想将信息放入数据库,因为我想保持它完全静态并可通过 CDN 提供服务。

【问题讨论】:

  • 您是否需要从应用程序代码本身访问文件,或者您可以直接从 s3 为这些文件提供请求
  • 我需要做的就是将新文件从 Rails 应用程序推送到 S3 存储桶。理想情况下,/blog/my-post.html 的请求应该检查 S3 存储桶中的文件,然后如果不存在将落入 Rails 应用程序。任何 Heroku dynos 都需要能够将修改推送到 S3 上的文件结构。

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


【解决方案1】:

在将数据写入 s3 方面,任何现有的 aws gem 都可以解决问题。如果我是你,我会看官方的 aws sdk 或雾。

有了雾,你可以写一个文件(假设 storage 是一个 Fog::Storage 对象)像

storage.directories.new(:key => 'bucket_name').files.create(:key => 'filename', :body => data)

data 可以是字符串或文件等 io 对象。

你可以有一个向控制器发送请求的路由

storage.directories.new(:key => 'bucket_name').files.head(file_name)

查看文件是否存在。根据您的需要,您可能希望缓存文件存在的事实,这样您就不必每次都调用 s3。

【讨论】:

  • 您能否详细说明一下我是如何设置 Rails 应用程序来检查 S3 文件然后回退到 Thin/unicorn 的?我很清楚如何写入 S3,只是不确定如何设置应用程序以便从外部存储中获得一些好处。
  • 我没有比使用我描述的 head 方法检查文件是否存在更聪明的方法了。如果你缓存这些检查应该很快
猜你喜欢
  • 2011-08-14
  • 2017-07-14
  • 2020-04-08
  • 2016-03-12
  • 1970-01-01
  • 2015-09-10
  • 2012-09-04
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多