2

我的 heroku 网站的根页面本质上是静态的,它在生成时在视图中有一些 ruby​​ 代码,但是没有特定于单个用户的,所以我希望它由 Varnish 缓存并在不打我的测功机的情况下提供服务(注意应用程序中还有其他动态页面)。

Heroku 在这里看起来很简单。只需添加 response.headers['Cache-Control'] = 'public, max-age=300',它会在重新生成之前缓存 5 分钟。

Time.now为了测试这一点,我进行了更改并将日期(在同一个浏览器上刷新工作正常,但我认为这是因为浏览器缓存,而不是 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 中,我是否缺少任何选项,我是否需要配置更多内容?如果您对提供快速静态页面有其他建议,我也会喜欢这些建议。

谢谢!

4

3 回答 3

3

我相信您的应用程序中有某些东西导致了这个问题(可能标头设置不正确?)。

为了测试这一点,我建立了一个应用程序,其中包含一个缓存页面和一个未缓存页面(除了将文本呈现到输出。

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 正在按照您的预期工作。我最初会查看您的身份验证系统以检查它是否没有做某事,因为这是一个很常见的场景(以确保缓存页面完全安全)

于 2012-01-03T13:43:52.470 回答
1

也许您在使用浏览器进行测试时正在发送 cookie?您的请求标头是什么?

如果你运行 curl -I http://host.com/两次,你会得到什么?

于 2011-12-29T13:03:43.273 回答
0

问题原来是 Heroku 有许多 Varnish 服务器,所以它需要大约 10-15 次页面刷新,直到页面被缓存到所有服务器上,之后它会保持缓存状态。它一直在工作,我只是在几次刷新没有工作后放弃了。

我还增加了 max_age 以便我可以更清楚地看到它,5 分钟的缓存几乎没有效果。

于 2012-01-05T16:18:45.663 回答