我正在使用带有 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);
}
}