使用自定义子域在Heroku上使用Rails caches_page?

时间:2011-11-29 00:08:20

标签: ruby-on-rails caching heroku subdomain

是否有可能让herokus Web服务器执行在子域上唯一键控的全页缓存(可能使用机架中间件?)

即。

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上是不可配置的:
http://www.agileproductions.com/blog_posts/16-Page-Caching-by-Subdomain-in-Rails-and-Nginx
https://github.com/yeah/page_cache_fu

1 个答案:

答案 0 :(得分:2)

Heroku上的页面缓存不是一个很好的选择,如Caching Strategies for Rails文章所述:

  

Rails的内置页面缓存通过在文件上创建文件来工作   系统。 Heroku有一个短暂的文件存储,所以虽然页面缓存可能   似乎工作,它将无法按预期工作。你应该改用   动作或片段缓存,或者使用Rack :: Cache作为   反向代理,以避免对您的应用程序的请求。

相反,最好将Rack :: Cache与dynos之间共享的缓存存储一起使用。例如,您可以使用其中一个Heroku memcache插件或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