0

一般来说,我是清漆和缓存的绝对新手,所以这个问题对某些人来说可能是微不足道的!

我正在构建一个 web 应用程序(在 rails 中),并且我正在寻找一些在生产服务器上缓存内容的选项。到目前为止,我已经看过 Varnish,并且有点担心 with-cookie 请求的非缓存。我理解为什么要这样做,但是如果有某种方法可以通过 cookie 缓存内容,那么有一个用例可能会真正受益。

在我的特殊情况下,许多 url 的数据都是相同的,与登录用户无关。例如,tripadvisor 可能会为每个登录用户返回相同的酒店列表数据(至少大部分数据)。所以本质上,虽然 cookie 会伴随请求/响应,但大约 90% 的页面对于每个用户来说都是通用的。

在这种情况下,是否可以使用 Varnish 来缓存此类 url / 页面(可能只有公共部分)。如果是,那么如何。

万分感谢 !

4

2 回答 2

2

如果我正确理解了您的用例。即使存在 cookie,您也希望缓存部分页面,因为这些页面对于所有用户都是相同的。

执行此操作的最佳方法是始终识别要缓存的页面,例如 /foo.html 和 /bar.html。对于这些页面,您可以删除 VCL 中的 Cookie 请求标头,以便 Varnish 可以缓存该页面。

您可以使用以下 VCL 代码作为示例:

sub vcl_fetch {
    [...]
    if(req.url ~ "/foo.html" || req.url ~ "/bar.html") {
        unset req.http.Cookie
    }

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

如果您有更多页面,您可以在if条件中使用正则表达式来匹配您的页面名称。

如果您只想缓存页面的一部分,那么您可以使用ESI,因为 Varnish 支持它支持有限但足够),但这需要您重写应用程序的一部分,恕我直言,使用 ESI 实际上是长期的 PITA运行(更难维护)。

于 2012-02-09T06:52:26.893 回答
0

默认的 Varnish vcl 将“传递”带有 cookie 的请求,但使用默认的 vcl 仅适用于测试您的 Varnish 服务器是否已启动和运行。如果不进行一些修改,默认的 vcl 几乎永远不会按需要工作。

您不一定需要删除 cookie。在 vcl_recv() 中更改使用 cookie 处理请求的方式更容易。默认情况下,vcl_hash() 不会对 cookie 进行散列。

此外 vcl_fetch() 在 Varnish 4 中不再存在。

于 2016-04-28T15:04:28.683 回答