是否有可能让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
答案 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
。