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

eve*_*ans 14 ruby-on-rails amazon-web-services ruby-on-rails-3 asset-pipeline amazon-cloudfront

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

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

Jam*_*ath 19

由于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"
Run Code Online (Sandbox Code Playgroud)

这是关于如何配置事物的一篇不错的文章:

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

不要混淆有关为源子域设置CNAME recprds的问题.仅当您想要使用自己的子域而不是amazons时,这才有意义.

  • 自定义源的工作方式是Cloudfront充当静态内容的代理.您可以将Rails配置为从cloudfront URL提供静态内容,但不要复制任何内容.然后,当用户从cloudfront请求静态内容时,cloudfront会说"我没有该文件,我会从应用程序中获取",它会从您的站点下载该文件,然后将其提供.从那时起,对静态项目的所有请求都来自cloudfront,而不会打扰您的应用程序. (8认同)

Jul*_*let 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
Run Code Online (Sandbox Code Playgroud)

使用这样的触发器:

after "deploy:assets:precompile", "assets:to_cdn"
Run Code Online (Sandbox Code Playgroud)

您还需要在配方中的某个位置启动编译:

load 'deploy/assets'
Run Code Online (Sandbox Code Playgroud)

结果:在资产编译结束时,所有资产都将在S3上推送,您将能够从cloudfront访问它们.

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

config.action_controller.asset_host = "http://assets.example.com"
Run Code Online (Sandbox Code Playgroud)