19

即使存在 cookie,我也想使用 Varnish 缓存某些页面。我需要注意 3 种可能性:

  1. 匿名用户正在查看某个页面
  2. 登录的用户正在查看一些带有轻度自定义的页面。这些自定义项都存储在签名 cookie 中,并由 Javascript 动态填充。未设置 vary-cookie http 标头。
  3. 登录的用户正在查看一些包含数据库中自定义数据的页面。设置了 vary-cookie http 标头。

预期的行为将是:

  1. 缓存页面。这是 Varnish 处理的最基本的场景。
  2. 缓存页面,不要删除 cookie,因为某些 Javascript 逻辑需要它。
  3. 永远不要缓存这个页面,因为 vary-cookie 表明 cookie 的内容会影响这个页面的输出。

我已经阅读了一些关于 Varnish 的文档,但我无法判断这是默认行为还是我必须在 VCL 中进行一些设置才能实现它。

4

1 回答 1

19

只有会话对每个客户端都是唯一的,不一定是 cookie。

你想要的东西是有意义的,并且可以使用 Varnish,这只是仔细制作你自己的 vcl 的问题。请注意default.vcl的以下部分:

sub vcl_recv {
    ...
    if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      return (pass);
    }
}


sub vcl_hit {
    if (!obj.cacheable) {
        return (pass);
    }
    ...
}


sub vcl_fetch {
    if (!beresp.cacheable) {
        return (pass);
    }
    if (beresp.http.Set-Cookie) {
        return (pass);
    }
    ...
}

您必须用自己的逻辑替换这些部分;即定义您自己的 vcl_ 函数。默认情况下,带有 cookie 的请求 (vcl_recv) 和响应 (vcl_fetch) 是不可缓存的。您最了解您的后端应用程序,您应该针对这种特定情况重写通用缓存逻辑。也就是说,您应该定义 varnish 在哪种情况下进行查找、传递或交付。

在您的情况下,您的页面(情况 1 和 2)将没有可变 cookie,这将被每个人缓存和共享(带有/不带 cookie 的请求);只是不介意 vcl_recv 中的 req.http.Cookie。我不会使用可变 cookie 缓存页面(案例 3) - 或者至少不会很长时间 - 因为它们根本无法共享;在 vcl_fetch 中“通过”。

于 2010-11-30T00:29:44.840 回答