14
  • 我正在使用 Rails 3.2 应用程序
  • 我创建了一个具有 S3 源的 Cloudfront 发行版
  • 我已经将 config.action_controller.asset_host 更改为我的云端资产
  • 我正在使用 capistrano

我想知道,每次部署时如何将我的预编译资产上传到 Cloudfront

4

3 回答 3

20

不需要 s3 存储桶,因为 Amazon Cloudfront 现在支持“自定义来源”。过去您必须指定一个 s3 存储桶作为源,但现在您可以将您的云端分发指向您的 rails 应用程序。

http://aws.typepad.com/aws/2010/11/amazon-cloudfront-support-for-custom-origins.html

因此,在您创建指向您可公开访问的应用程序的发行版后,您将资产主机设置在适当的配置文件中,例如 production.rb,然后您就可以参加比赛了。

config.action_controller.asset_host = "url of your cloudfront distribution"

这是一篇关于如何配置的文章:

http://ryantownsend.co.uk/post/13126016608/cloudfront-cdn-on-rails

不要对有关为源子域设置 CNAME recprds 的内容感到困惑。这仅在您想使用自己的子域而不是亚马逊时才相关。

于 2012-05-25T04:04:53.787 回答
15

安装 aws-s3 gem 后,您可以在 capistrano 配方的末尾添加:

set :cdn_user, "KEY ID" # This is called "CDN KEY API" for AWS
set :cdn_api_key, "YOUR KEY SECRET"
set :cdn_container, "bucket name"

namespace :assets do
    task :to_cdn do
      require 'aws/s3'
      AWS::S3::Base.establish_connection!(:access_key_id => cdn_user, :secret_access_key => cdn_api_key )
      assets_dir = "#{shared_path}/assets"
      Dir.glob(assets_dir + "/**/*").each do |file|
        if !File.directory?(file)
          cdn_filename = file.gsub(assets_dir,"assets")
          AWS::S3::S3Object.store(cdn_filename, open(file) , cdn_container)
        end
      end
    end
end

使用这样的触发器:

after "deploy:assets:precompile", "assets:to_cdn"

您还需要在配方中的某个时间点启动编译:

load 'deploy/assets'

结果:在您的资产编译结束时,您的所有资产都将被推送到 S3 上,您将能够从云端访问它们。

然后,您必须更新您的 config/environment/production.rb 以指向您的 CDN URL。

config.action_controller.asset_host = "http://assets.example.com"
于 2012-05-24T22:32:39.373 回答
3

有一个很棒的 Ruby gem 可以处理这个问题,叫做AssetSync。如果将它与turbo-sprockets结合使用,则可以确保在部署时只复制新的或更新的资产。

于 2013-04-09T16:18:18.333 回答