如何配置Carrierwave以使用多个CDN CNAME URL

时间:2014-03-12 08:36:28

标签: ruby-on-rails amazon-s3 carrierwave amazon-cloudfront

在Rails中,我可以从CDN提供资源,并设置多个CNAMES以便同时加载。

例如,我将config.action_controller.asset_host = "http://assets-%d.myappp.com"放在config / environments / production.rb中,然后我的资产从

提供
http://assets-0.myapp.com
http://assets-1.myapp.com
http://assets-2.myapp.com

这很棒,并且大大增加了页面加载时间。

我的应用包含许多通过Carrierwave处理的用户生成的图像。我想对这些图像应用相同的方法。我已经设置了CDN,在config / initializers / carrierwave.rb中我添加了以下内容:

config.asset_host = "http://images.myapp.com"

现在我有两个问题:

  1. 如何确保此CDN仅用于生产?
  2. 如何使用多个URL(例如images-0.myapp,images-1.myapp等)。 %d 方法似乎不适用于初始化程序。

2 个答案:

答案 0 :(得分:5)

我今天遇到了同样的问题并提出了这个问题:

# staging
ENV['S3_CLOUDFRONT_DOMAIN'] = "//s3.amazonaws.com/bucket"

# production
ENV['S3_CLOUDFRONT_DOMAIN'] = "//assets%d.domain.com"

在初始化程序中:

# config/initializers/carrierwave.rb
if ENV['S3_CLOUDFRONT_DOMAIN'] =~ /%d/
  config.asset_host = proc do |file|
    "#{ENV['S3_CLOUDFRONT_DOMAIN'] % (Zlib.crc32(file.filename) % 4)}"
  end
else
 config.asset_host = ENV['S3_CLOUDFRONT_DOMAIN']
end

请注意,我在我的域名中使用了ENV变量,而且我的file.filename对应于我的已安装列。我没有时间找到通过帮助程序访问可安装列的方法,所以我必须回过头来,现在它可以正常工作。

这将处理多个CDN端点和单个端点以进行分段或开发。确保协议或至少" //"是为你的终点提供的,否则Carrierwave认为它是一个文件夹最终是/images/s3.amazonaws.com/site/path/to/file.jpg

希望这也适合你。

另外,我使用的是Carrierwave 0.9.0

答案 1 :(得分:1)

Johnkoht的回答让我看到了载波reference docs。他们建议

CarrierWave.configure do |config|
  config.asset_host = proc do |file|
  identifier = # some logic (note: I used "images-#{rand(3)}
  "http #{identifier}.cdn.rackspacecloud.com"
  end
end

我将它与用于载波产生的专用初始化器结合起来并使其正常工作