我想知道,每次部署时如何将预编译资产上传到Cloudfront
答案 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结合使用,则可以确保在部署时仅复制新资产或更新资产。