2011-11-29 63 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

相关问题