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

And*_*vey 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

现在我有两个问题:

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

joh*_*oht 5

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

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

# production
ENV['S3_CLOUDFRONT_DOMAIN'] = "//assets%d.domain.com"
Run Code Online (Sandbox Code Playgroud)

在您的初始化程序中:

# 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
Run Code Online (Sandbox Code Playgroud)

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

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

希望对你也有用.

另外,我正在使用Carrierwave 0.9.0