ruby-on-rails - Heroku & Rails - Varnish 只是偶尔缓存

标签 ruby-on-rails ruby-on-rails-3 heroku varnish http-caching

我有一个类似于 Heroku & Rails - Varnish HTTP Cache Not Working 的问题,但解决方案(稍等片刻,然后一切正常)似乎并不适用 - 我已经进行了以下设置好几天了。

This thread在 Heroku Google 组上有一些用户遇到同样的问题。他们提到缓存所有内容需要一段时间,但我的理解是一段时间后,所有内容都应该被缓存,不是吗?还是仅在流量很大时才适用?

我需要一些关于我应该在哪里寻找/我可以尝试更改什么以使缓存正常工作的建议。

我的设置:

我有http://www.swingoutlondon.co.uk在 Heroku(Rails 3.0.3、Ruby 1.9.2、bamboo-mri-1.9.2)上运行,主索引页面执行大量数据库查询以返回本质上是静态页面的内容——通常需要大约 2-3 秒 < em>(是的,这是我确实需要解决的问题,但我认为 Varnish 缓存是一个快速的胜利)。

我已经按照描述设置了 Cache-Control 响应 header here , 事实上,这似乎确实已在页面上设置:

>> curl -I http://swingoutlondon.co.uk

HTTP/1.1 200 OK
Server: nginx
Date: Sun, 13 May 2012 00:01:05 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: public, max-age=300
Etag: "2565201f3ae39c6a9a1f6b1fb8bbbe0a"
X-Ua-Compatible: IE=Edge,chrome=1
X-Runtime: 1.699667
Content-Length: 44224
Accept-Ranges: bytes
X-Varnish: 681634826
Age: 0
Via: 1.1 varnish

注意:Cache-Control: public, max-age=300

我假设 Age: 0 表示它没有检索到缓存的副本,实际上命令在正常的 2-3 秒内返回。

如果不断重复尝试 curl,我偶尔可以缓存副本(页面加载时间不到半秒,Age 大于 0)。

我必须承认我没有完全理解 HTTP header ,但一个线索可能是:当 Age 大于 0 时,我在 X-Varnish 中得到两位数(在所有其他情况下,我只得到一套):

X-Varnish: 848670407 848650521

这是我检查过的内容:

  • 每次的来源都是相同的。
  • 我在该页面上有一个 before_filter,它将页面上次更新的时间设置为实例变量。
  • 有许多 cookie - 据我所知,它们都是由 Google Analytics 或 Twitter 或 Facebook 按钮设置的。

为了更好的衡量,这里是我的请求 header :

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utma=264326157.189257391.1336869624.1336869624.1336869624.1; __utmb=264326157.2.10.1336869624; __utmc=264326157; __utmz=264326157.1336869624.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Host:www.swingoutlondon.co.uk
If-None-Match:"2565201f3ae39c6a9a1f6b1fb8bbbe0a"
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19

最佳答案

嗯 - 事实证明,因为 Heroku 使用多个独立的 Varnish 服务器,并且因为到 Swing Out London 的流量相对较低,所以如果我的 max-age 只有 5 分钟,我不应该期望缓存有很多页面.将其设置为 20 或 30 分钟会产生更多缓存。

我写了详细的blog post收集我的经验。感谢Garry Shulter帮助我解决这个问题。

关于ruby-on-rails - Heroku & Rails - Varnish 只是偶尔缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10568637/

相关文章:

ruby-on-rails - 原始字符串 REXML 解析中的非法字符 '&'

github - 如何向 heroku 添加 API key 和其他安全内容?

javascript - 使来自 rails 模型的伪属性也可以在 javascript 中访问

ruby-on-rails-3 - 混合 has_one 和 has_and_belongs_to_many 关联

ruby-on-rails - 从 Rails 3.1 引擎中访问主应用程序的 CanCan 规则

javascript - 部署在heroku上的angularjs应用程序web.js结构

ruby-on-rails - 如何将字符串列更改为 bigint?

ruby-on-rails - 使用 Ruby on Rails 的表单助手

javascript - 充当 votable javascript 投票按钮