我是新的清漆,并扭转一般的代理。 我在一个像博客那样工作的应用程序中testingVarnish,在这个应用程序中,我有一个“updated_at”的页面,一旦页面更新,这个页面就会改变。 因此,我决定我的caching策略应该基于最后修改的标题。 原因是用户希望在后台修改页面后立即看到更改。
除此之外,我明白我可以添加一个s-maxage与必须重新validationcaching控制,所以如果最后修改没有改变光油甚至不会尝试提出新的要求。
我也为浏览器添加了一个expire,所以会有一个客户端caching。 因此,浏览器甚至不会要求清漆再次向Apache发出请求。
但是,我注意到,caching控制s-maxage优先于最后修改,即使使用must-revalidate。 而且,即使我不添加caching控制,“最后修改”也不起作用。 清漆使用默认的ttl,没有任何反应。 我究竟做错了什么?
我正在使用Symfony,这是头文件:
$response = new Response(); $response->setPublic(); // expiration model for the browser cache (EXPIRE) // the browser will only make a new request to Varnish again after ten minutes (600 seconds) $date = new \DateTime(); $date->modify('+600 seconds'); $response->setExpires($date); // expiration model for Varnish (CACHE-CONTROL) // Varnish will only make a new request to Apache again after one hour (3600 seconds) // The must-revalidate tells Varnish to do this request before serving the files after one hour (it's already de default behaviour) // cache-control has priority over expire //$response->setSharedMaxAge(3600); $response->headers->addCacheControlDirective('must-revalidate', true); // validation model for varnish (LAST-MODIFIED) // Varnish will only make a new request to Apache again if the updated_at of the page changed even if the expiration time is ended $response->setLastModified($page->getUpdatedAt()); // if the response didn't change, stop here if ($response->isNotModified($request)) { return $response; }
这是我头一次有头一次,第二次有头一次。 然后,如果最后修改的标题总是与第二个标题相同则无关紧要。 (我的浏览器cacher被禁用,所以我有200而不是304)
第一个要求
第二个请求
没有“Last Modified不起作用”的东西。 这个头文件只是简单的说明date资源是上次修改的 客户之后可能会发出“如果没有修改”的请求,但这对您的情况并不重要。
随后的请求将返回完全相同的头文件是很自然的。 caching中的对象包含标题信息。 所以当Varnish提取一个caching的条目时,它会返回它的精确副本。
您正在同时处理两个caching:清漆和浏览器caching。 每个请求只有一组HTTP标头。 您不能为浏览器指定一个HTTP Expires,而只能为Varnish指定另一个HTTP Expires。
所以如果你想caching不同的东西(你也是这样),一个解决scheme就是将beresp.ttl中的beresp.ttl调整为你希望放松PHP后端的时间,即24小时。
在VCL的某处:
sub vcl_backend_response { # A TTL of 24h # set beresp.ttl = 24h; }
然后,考虑到您保留现有的PHP代码,Varnish会将第一个请求caching到页面24小时,并使其可被浏览器caching10分钟。
文章更新后,您必须清除清漆caching,也就是caching无效。 看到这个页面上的一些见解(滚动到底部)。
原因是用户希望在后台修改页面后立即看到更改。
而你却希望他们有10分钟的浏览器caching:)