Heroku& Rails - Varnish只是偶尔缓存

时间:2012-05-13 01:13:57

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

我遇到了与Heroku & Rails - Varnish HTTP Cache Not Working类似的问题,但是解决方案(等待一段时间,然后一切正常)似乎不适用 - 我已经在几天内进行了设置。

Heroku Google小组上的

This thread让一些用户遇到同样的问题。他们提到缓存所有内容需要一段时间,但我的理解是,一段时间后,一切都应该被缓存,不是吗?或者这只适用于有大量流量的情况?

我需要一些建议,我应该在哪里寻找/我可以尝试改变,以便让缓存正常工作。

我的设置:

我在Heroku上运行http://www.swingoutlondon.co.uk(Rails 3.0.3,Ruby 1.9.2,bamboo-mri-1.9.2),主索引页执行大量数据库查询以返回基本上是静态的页面 - 通常需要大约2-3秒(是的,这是我真正需要解决的问题,但我认为清漆缓存是一个快速的胜利)

我按照here所述设置了Cache-Control响应标头,实际上这似乎已在页面上设置:

>> 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秒。

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

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

X-Varnish: 848670407 848650521

这是我检查的内容:

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

为了更好地衡量,这是我的请求标题:

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

1 个答案:

答案 0 :(得分:1)

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

我写了一篇详细的blog post来收集我的知识。感谢Garry Shulter帮助我解决这个问题。