2014-03-12 28 views
2

在Rails中,我可以從CDN提供資源,並設置多個CNAMES以同時加載。如何配置Carrierwave使用多個CDN CNAME網址

比如我把config.action_controller.asset_host = "http://assets-%d.myappp.com"在配置/環境/ production.rb,然後我的資產從

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

這是偉大的,並大幅提高頁面加載時間提供服務。

我的應用程序包含很多用戶生成的圖像,通過Carrierwave處理。我想對這些圖像應用相同的方法。我已經設置了CDN,並在配置/初始化/ carrierwave.rb我已經添加了以下內容:

​​

現在我有兩個問題:

  1. 我如何確保這CDN僅用於生產?
  2. 如何使用多個URL(例如圖像-0.6,應用程序圖像1.myapp等)。 %d 方法在初始化程序中似乎不起作用。

回答

4

今天我有同樣的問題以及與此想出了:

# 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爲結尾的文件夾。

Hope這也適合你。

而且,我使用Carrierwave 0.9.0

+0

也許你可以添加你設置'ENV [「S3_CLOUDFRONT_DOMAIN」] =「//s3.amazonaws信息。 com/bucket「' 這可能對您很明顯,但不是每個人都會在您的答案上發生。 – jottr

1

Johnkoht的回答讓我看carrierwave 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 

我結合這個有專用的初始化爲carrierwave生產,得到它的工作