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"
现在我有两个问题:
%d
方法似乎不适用于初始化程序.我今天遇到了同样的问题并提出了这个问题:
# 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