把 Ruby on Rails 的 assets 放到 CloudFront CDN

為了不要讓 assets  (共用圖片、CSS、JavaScript 等) 下載時擠到網頁主要內容的頻寬,我把 Rails 的 assets放到 AWS CloudFront 上面,並且設不同的網域名稱,這在 Y!Slow 的建議中有提到。

之前的做法是在 deploy 以後 (Capistranoafter "deploy:update_code") 把 public/ 給同步到 S3 的某個 bucket,然後在 CloudFront 那邊開一個 distribution 設 origin 到該 bucket。不過缺點是每次 deploy 都要等待它上傳。雖然有 custom origin 可以用,但實作上比較麻煩,所以就一直拖著。

前幾天 AWS Console 多了可以從管理頁面指定 CloudFront custom origin 的選項,不過已經存在的 distribution 不能更改 origin,只能在新增 distribution 的時候指定,但總之滑鼠點一點就行了,方便許多。

我把 origin 設為我的 production 主機,這樣子它可以直接去 production 抓檔案。當然 distribution 的 CNAME assets[1-3].domain.com 一定要設的啊,接著測試一下 distribution 給的 domain name 連過去有沒有正確,就可以去 DNS 設定中把原本的 assets CNAME 指到新的 distribution 了。

別忘了 Rails 的 config/environment/production.rb 裡面有個 config.action_controller.asset_host 也要改,具體寫法問 Google (ry