【问题标题】:Varnish / Squid content caching with cookiesVarnish / Squid 内容缓存与 cookie
【发布时间】:2012-03-01 02:18:12
【问题描述】:

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

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

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

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

非常感谢!

【问题讨论】:

    标签: ruby-on-rails caching squid varnish varnish-vcl


    【解决方案1】:

    如果我正确理解了您的用例。即使存在 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 的supported(支持有限但足够),但这需要您使用 ESI 重写部分应用程序和恕我直言从长远来看确实是一个 PITA(更难维护)。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 2023-03-08
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 2013-03-17
        相关资源
        最近更新 更多