- 我正在使用 Rails 3.2 应用程序
- 我创建了一个具有 S3 源的 Cloudfront 发行版
- 我已经将 config.action_controller.asset_host 更改为我的云端资产
- 我正在使用 capistrano
我想知道,每次部署时如何将我的预编译资产上传到 Cloudfront
我想知道,每次部署时如何将我的预编译资产上传到 Cloudfront
不需要 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 的内容感到困惑。这仅在您想使用自己的子域而不是亚马逊时才相关。
安装 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"
有一个很棒的 Ruby gem 可以处理这个问题,叫做AssetSync。如果将它与turbo-sprockets结合使用,则可以确保在部署时只复制新的或更新的资产。