2013-10-31 64 views
2

我一直在爲在nginx後面運行的rails應用程序設置多個cloudfront端點以改善頁面加載時間。基本上 - 我們有一個單一的端點建立,似乎一直在努力罰款前,但是當我在第二端點添加使用以下聲明asset_host:Cloudfront爲源服務器上存在的資產緩存nginx的404s

config.action_controller.asset_host = Proc.new do |source| 
    hosts = ["https://url1.cloudfront.net", "https://url2.cloudfront.net"] 
    hosts[source.hash % 2] 
end 

每當我部署(用一個漂亮的香草Capistrano的部署腳本),一些資產沒有加載 - cloudfront正在緩存nginx 404頁面。如果我使cloudfront的緩存無效,資產全部加載正常。

capistrano腳本本身在重新啓動獨角獸前進行編譯,所以應該沒有html引用新資產文件名稱,但是,cloudfront在部署後立即緩存404s。

我確實無法在每次部署後使雲端緩存失效,這需要很長時間。有沒有人遇到過這個問題?有關如何解決此問題的任何建議?

回答

2

我想通了。發現我們的預加載和資產更改監控端點(在資產發生變化並需要重新加載時向前端報告)正在根據磁盤的摘要列表進行測試以作出此決定。當然 - 磁盤摘要可以超越所有機器上實際編制的摘要,主要瀏覽器在實際準備好之前嘗試提取資產。

對於其他人使用這樣的技術來檢驗資產的變化 - 可能我建議使用存儲在應用程序中的散列:

MyAppNamespace::Application.config.assets.digests 

希望這可以幫助其他人!

實際上 - 問題的真正來源是使用:hash方法來確定要提供哪個url - 而該方法的輸出將在單個進程內保持一致 - 因此它不會跨進程,因此不同的服務器服務於不同的哈希,並且由於他們都在平衡器之後,並不是所有的服務器都有被請求的資產。

+0

感謝您的回答:D您可以重寫一個更具體的答案。或者我自己做? ^^ – Awea