2011-11-29 61 views
1

是否有可能使herokus Web服務器進行全頁面緩存唯一鍵的子域(可能使用機架中間件?)在heroku上使用自定義子域的Rails caches_page?

即。

class MyController < ApplicationController 
    caches_page :index 

    def index 
    @content = MyObject.find(request.subdomain) 
    ... 

subdomain1.myapp.com > <cachedir>/subdomain1/index.html 
subdomain2.myapp.com > <cachedir>/subdomain2/index.html 

下面的技術要求,以nginx的重寫訪問它似乎並沒有成爲在Heroku上配置:在Heroku
http://www.agileproductions.com/blog_posts/16-Page-Caching-by-Subdomain-in-Rails-and-Nginx
https://github.com/yeah/page_cache_fu

回答

2

頁面緩存是不是一個很好的選擇,如描述Caching Strategies for Rails文章:

的Rails內置的頁面緩存的工作由文件 系統上創建一個文件。 Heroku有一個短暫的文件存儲,所以雖然頁面緩存可能 似乎工作,它不會按預期工作。您應該改用 動作或片段緩存,或者使用Rack :: Cache作爲 反向代理來完全避免對應用的請求。

相反,最好使用Rack :: Cache和dynos之間共享的緩存存儲。例如,您可以使用其中一個Heroku內存緩存插件或AWS ElastiCache以及其他選項。 Rack :: Cache很容易在Heroku上運行;見Using Rack::Cache with Memcached in Rails 3.1+

而不是說caches_page將頁面寫入文件系統,您將使用諸如expires_in等方法在HTTP標頭中指定所需的緩存行爲。請注意,這些標題不僅會影響緩存,還會影響瀏覽器緩存。

「但是等待」,你問,「如果用戶瀏覽器也可以保留一個頁面,我該如何從Rack :: Cache過期?」答:你沒有。相反,請設計緩存以利用conditional GETs。無論如何,重新驗證通常比手動過期更容易。

Rack :: Cache僅僅是一個普通的HTTP緩存,您可以在用戶的​​瀏覽器緩存和Web應用之間進行分層。請參閱Things Caches Do瞭解更多詳情。好消息是,一旦你獲得了正確的緩存,它就可以在服務器端和客戶端工作。你的應用可以和緩存代理一起玩,你甚至可以放入CloudFront或者其他CDN--畢竟,你的緩存完全由標準的HTTP頭來描述。

Rack :: Cache默認在緩存鍵中包含HTTP Host:標頭,所以子域自動處理。一旦你在Heroku上設置,你需要做的就是expires_in 30.minutes, :public => true

相關問題