Rails如何将预编译资产上载到Cloudfront

时间:2012-05-24 22:09:20

标签: ruby-on-rails ruby-on-rails-3 amazon-web-services asset-pipeline amazon-cloudfront

  • 我正在使用Rails 3.2应用程序
  • 我创建了一个带有的Cloudfront发行版 S3原点
  • 我已经将config.action_controller.asset_host更改为my cloudfront资产
  • 我正在使用capistrano

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

3 个答案:

答案 0 :(得分:18)

由于Amazon Cloudfront现在支持“自定义源”,因此不需要s3存储桶。过去,您必须指定一个s3存储桶作为源,但现在您可以将您的cloudfront分发指向您的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的问题感到困惑。仅当您想要使用自己的子域而不是亚马逊时,这才有意义。

答案 1 :(得分:14)

安装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"

答案 2 :(得分:3)

有一个很棒的Ruby gem来处理这个名为AssetSync的东西。如果将其与turbo-sprockets结合使用,则可以确保在部署时仅复制新资产或更新资产。