我的heroku网站的根页面本质上是静态的,它在生成时在视图中有一些ruby代码,但没有特定于单个用户的代码,所以我希望使用Varnish缓存它,并在不影响dyno的情况下提供服务(请注意,应用程序中还有其他动态页面)。
Heroku让它看起来非常简单,here。只需添加response.headers['Cache-Control'] = 'public, max-age=300'
,它将在重新生成之前缓存5分钟。
为了测试这一点,我进行了更改,并将日期(Time.now
)输出到页面,以查看它是否会在5分钟内保持不变,但每次我在新浏览器上访问页面时,它都会更新。在相同的浏览器上刷新可以很好地工作,但我认为这是因为浏览器缓存,而不是Heroku。
如果有帮助的话,当我执行curl -i来获取HTTP头时,我会得到这样的结果:
HTTP/1.1 200 OK^M
Server: nginx/0.7.67^M
Date: Thu, 29 Dec 2011 02:03:33 GMT^M
Content-Type: text/html; charset=utf-8^M
Connection: keep-alive^M
Cache-Control: public, max-age=300^M
X-Ua-Compatible: IE=Edge^M
Etag: "8a1b58f048968803980417a2914764d0"^M
X-Runtime: 0.038393^M
Content-Length: 8310^M
X-Varnish: 1040651825^M
Age: 0^M
Via: 1.1 varnish^M
基本上,我希望确保它只生成一次,然后在Varnish中缓存,我是否遗漏了任何选项,我需要配置更多的选项吗?如果你有其他关于快速静态页面的建议,我也很喜欢。
谢谢!
发布于 2012-01-05 16:18:46
问题被证明是Heroku有许多Varnish服务器,所以大约需要10-15次页面刷新,直到页面在所有服务器上被缓存,之后它将保持缓存。它一直在工作,我只是在几次刷新无效后放弃了。
我还增加了max_age,这样我可以更清楚地看到它,5分钟的缓存几乎没有任何影响。
发布于 2012-01-03 13:43:52
我认为是你的应用程序中的某些东西导致了这个问题(可能是头部设置不正确?)。
为了测试这一点,我放置了一个应用程序,其中包含一个缓存的页面和一个未缓存的页面(除了将文本呈现到输出之外,什么都没有。
http://morning-earth-1972.heroku.com/base/cache
http://morning-earth-1972.heroku.com/base/no_cache
请注意,在打印时间的五分钟内,缓存版本不会更改。
源代码可以在这里找到:https://github.com/neilmiddleton/heroku_varnish_test_SO_8663326
因此,Heroku的工作方式符合您的预期。我最初会检查您的身份验证系统,以检查它是否有问题,因为这是一个相当常见的场景(以确保缓存页面是完全安全的)
发布于 2011-12-29 13:03:43
也许你在用浏览器测试的时候正在发送cookies?你的请求头是什么?
如果你运行curl -I http://host.com/两次,你会得到什么?
https://stackoverflow.com/questions/8663326
复制