配置 Varnish 4 VCL 仅为匿名用户缓存特定页面(使用 Django)

配置 Varnish 4 VCL 仅为匿名用户缓存特定页面(使用 Django)

我正在使用带有 Varnish 4 的 Django。

我正在努力实现这一目标:

  • 如果请求不是针对主页,则通过(我目前尝试仅缓存主页以进行测试等)
  • 如果 cookie“sessionid”存在,则为每个会话传递或缓存
  • 其他:通过

以下是sub vcl_recv的配置:

# cache only home page
    if (! req.url == "/") {
            return(pass);
    }

    # not caching if cookie sessionid is present
    if (req.http.Cookie ~ "sessionid") {
            return(pass);
    }

    unset req.http.cookie;

到目前为止,当将主页称为匿名时,Varnish 似乎总是会为每个主页生成一个新页面。我可以使用 Varnish 发送的标头来判断('age' 始终为 0,而 'X-Varnish' 始终是不同的数字)。

要么是我的配置缺少了什么,要么是因为 Django 在响应中发送了“Vary: Cookie”?如果是这种情况,我该如何在这种情况下“隐藏”Varnish 的 cookie(仅适用于匿名用户)?

答案1

问题在于 Django 发送了一个“Vary: Cookie”标头每时每刻。我认为这是因为“auth”插件,但我没有调查这一点,我只是在服务器返回响应时删除了标头。

以下是 Varnish 文档中关于 ‘vary: cookie’ 的说明:

另一个错误用法的例子是仅使用 Vary: Cookie 来区分响应。同样,可能会有大量的 cookie,因此也有大量缓存对象,而这些对象很可能只会由其原始请求者检索。

来源:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary

以下是我的 VCL 配置(我删除了上部,它只是服务器配置):

sub vcl_recv
{
        # caching only home page
        if (! req.url == "/") {
                return(pass);
        }

        # not caching if cookie sessionid present
        if (req.http.Cookie ~ "sessionid") {
                return(pass);
        }

        unset req.http.cookie;

}

sub vcl_backend_response
{

        if (bereq.url == "/") {
                unset beresp.http.Vary;
                return(deliver);
        }
}

相关内容