Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 希罗库;Rails-Varnish HTTP缓存不工作_Ruby On Rails 3_Heroku_Varnish_Http Caching - Fatal编程技术网

Ruby on rails 3 希罗库;Rails-Varnish HTTP缓存不工作

Ruby on rails 3 希罗库;Rails-Varnish HTTP缓存不工作,ruby-on-rails-3,heroku,varnish,http-caching,Ruby On Rails 3,Heroku,Varnish,Http Caching,我的heroku网站的根页面本质上是静态的,它在生成时在视图中有一些ruby代码,但没有特定于单个用户的代码,因此我希望它通过Varnish缓存,并在不影响我的dyno的情况下提供(请注意,应用程序中还有其他动态页面) Heroku让它看起来很简单。只需添加response.headers['Cache-Control']='public,max age=300',它将在重新生成之前缓存5分钟 为了测试这一点,我更改了日期并将日期(Time.now)输出到该页面,以查看它是否会保持5分钟不变,但

我的heroku网站的根页面本质上是静态的,它在生成时在视图中有一些ruby代码,但没有特定于单个用户的代码,因此我希望它通过Varnish缓存,并在不影响我的dyno的情况下提供(请注意,应用程序中还有其他动态页面)

Heroku让它看起来很简单。只需添加
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中,我是否缺少任何选项,是否需要配置更多的内容?如果你有其他关于快速静态页面的建议,我也会喜欢的


谢谢

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


如果运行curl-I两次,会得到什么结果?

我认为应用程序中存在导致此问题的原因(可能是标头设置不正确?)

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

请注意,缓存版本在打印时间的五分钟内不会更改

可在此处找到来源:


因此,Heroku正在按照您的预期工作。我将首先检查您的身份验证系统,以检查它是否有任何作用,因为这是一个非常常见的场景(以确保缓存的页面完全安全)

问题是Heroku有很多Varnish服务器,因此需要大约10-15次页面刷新,直到页面被缓存到所有服务器上,然后页面才会被缓存。它一直在工作,我只是在几次刷新都不起作用后放弃了


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

还要注意,我有一个身份验证系统,它可能会添加一些before_过滤器,但它们不会影响主页的输出。我可以确认你正在Aspen或Bambol堆栈上运行吗?我发送的邮件是否重要当我用我的浏览器测试Cookie时?Varnish是否应该缓存而不管是否存在Cookie?运行curl-l两次会得到相同的结果,每次都会生成日期。我不知道Heroku的Varnish是如何配置的,如果你知道如何配置的,或者是否有权访问VCL文件,将其发布到此处将非常有用。但是在默认的VCL fil中e Varnish被配置为在存在cookie的情况下将请求传递到后端服务器。其原理如下:如果你有cookie,这是因为你在网站上经过身份验证,你很可能不想获得缓存页面,这样你就可以看到你的个性化信息(如果有的话)。我很确定Heroku被配置为缓存不管Cookie如何。谢谢你的回复!我的身份验证系统确实有一个before_过滤器,这会阻止缓存吗?有趣的是,我认为我的问题可能是因为Heroku有多个Varnish服务器,所以你需要在每个服务器中缓存多个点击。我刷新了几次,然后放弃了,因为没有缓存任何东西,你真的吗y必须刷新大约10-15次,但之后就可以了。有趣的是,您的实现似乎没有受到影响,可能是因为Heroku在后端做了一些事情。不确定您是否正确。是的,Heroku有很多varnish服务器,但它们作为一个集群和一个缓存运行。嗯……在我刷新几次之后,我获取一系列不同的日期,但它们都是旧日期。我已确保我处于匿名模式,因此没有Cookie之类的内容。我注意到你的应用程序没有出现过这样的问题,尽管=S…你正在运行多少个dyno?你确定没有缓存到本地dyno上的磁盘(你可以写入/tmp)