【问题标题】:Rails How to upload precompiled assets to CloudfrontRails 如何将预编译的资产上传到 Cloudfront
【发布时间】:2012-05-31 12:56:38
【问题描述】:
  • 我正在使用 Rails 3.2 应用程序
  • 我创建了一个 Cloudfront 发行版,其中包含 S3起源
  • 我已经将 config.action_controller.asset_host 更改为我的 云端资产
  • 我正在使用 capistrano

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢keyz,这是一个很好的解决方案,但我有点怀疑,当我再次部署时,资产发生了什么,我的意思是,我的缓存资产或过期标头会有问题吗?
    • 资产在生产中被指纹识别(名称中添加了 md5 哈希),因此您可以将资产的所有版本保存在同一个文件夹中。资产管道的魔力。这可以防止更新时出现缓存问题:旧版本仍然存在,新版本仍然可用。
    • 您还应该阅读有关资产管道的完整文档:guides.rubyonrails.org/asset_pipeline.html
    • 我明白了...最后一个问题是,发生了什么我只想保持最新版本?谢谢。
    • 这是我为我的客户所做的:我只维护最新版本。您必须了解某些代理可能会缓存您的网站几秒钟/几分钟,并且您可以在用户下载 index.html 和他下载您的 CSS 或 JS 文件的那一刻之间重新部署。在这种情况下,那些 CSS 和 JS 仍然可用......所以你可以在匆忙中重新部署(测试批准并在电视上做广告)
    【解决方案2】:

    不再需要 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 的内容感到困惑。仅当您想使用自己的子域而不是亚马逊时,这才相关。

    【讨论】:

    • 自定义来源的工作方式是 Cloudfront 充当静态内容的代理。您将 Rails 配置为从云端 url 提供静态内容,但您不复制任何内容。然后,当用户从 cloudfront 请求静态内容时,cloudfront 会说“我没有那个文件,我会从应用程序中获取它”,它会从您的站点下载该文件,然后提供它。从那时起,对该静态项目的所有请求都来自云端,而不会打扰您的应用。
    • 以上是使用分布式服务器通过 Cloudfront 为 Rails 资产提供服务的最佳方法,除非您有非常大的资产、大量服务器、需要在编译后处理资产或需要保留旧版本的资产。在这些情况下,请使用 assets_sync gem。
    【解决方案3】:

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

    【讨论】:

    • 谢谢,我试试看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多