强制请求错过缓存但仍存储响应

Tom*_*nal 7 cache varnish

我有一个缓慢的网络应用程序,我在它前面放置了 Varnish。所有页面都是静态的(它们不会因不同的用户而变化),但它们需要每 5 分钟更新一次,以便包含最近的数据。

我有一个简单的脚本 ( wget --mirror),它每 15 分钟抓取一次整个网站。每次爬行大约需要 5 分钟。爬网的目的是更新 Varnish 缓存中的每个页面,这样用户就不必等待页面生成(因为所有页面都是最近生成的,这要归功于蜘蛛)。

时间线如下所示:

  • 00:00:00:缓存已刷新
  • 00:00:00: Spider 开始爬行以使用新页面更新缓存
  • 00:05:00: Spider完成抓取,所有页面更新至00:15:00

0:00:00 到 0:05:00 之间的请求可能会访问尚未更新的页面,并且将被迫等待几秒钟以等待响应。这是不能接受的。

我想做的是,也许使用一些 VCL 魔法,总是将来自蜘蛛的请求转发到后端,但仍将响应存储在缓存中。这样,用户将永远不必等待页面生成,因为没有 5 分钟的时间窗口,其中部分缓存是空的(可能除了在服务器启动时)。

我怎样才能做到这一点?

Sha*_*den 10

req.hash_always_miss 应该做的伎俩。

不要在蜘蛛运行开始时进行完全缓存刷新。相反,只需将蜘蛛设置为工作 - 在您的 中vcl_recv,将蜘蛛的请求设置为始终错过缓存查找;他们将从后端获取一个新副本。

acl spider {
  "127.0.0.1";
  /* or whereever the spider comes from */
}

sub vcl_recv {
  if (client.ip ~ spider) {
    set req.hash_always_miss = true;
  }
  /* ... and continue as normal with the rest of the config */
}
Run Code Online (Sandbox Code Playgroud)

在这种情况发生时,直到新的响应在缓存中,客户端将继续无缝地为它们提供旧缓存(只要它仍在其 TTL 内)。