我遇到了与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
,它将页面上次更新的时间设置为实例变量。为了更好地衡量,这是我的请求标题:
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
答案 0 :(得分:1)
很好 - 事实证明,因为Heroku使用多个独立的Varnish服务器,并且由于到Swing Out London的流量相对较低,如果我的max-age只有5分钟,我不应该期望有很多页面由缓存服务。将其设置为20或30分钟会导致更多缓存。
我写了一篇详细的blog post来收集我的知识。感谢Garry Shulter帮助我解决这个问题。