我想使用Varnish来缓存某些页面,即使存在cookie也是如此。我需要处理3种可能性:
预期的行为是:
我已经阅读了一些关于Varnish的文档,我不知道这是否是默认行为,或者我是否需要在VCL中进行一些设置以实现它。
答案 0 :(得分:18)
只有会话对每个客户都是唯一的,不一定是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)不可缓存。您最了解后端应用程序,并且应该将通用缓存逻辑重写为此特定情况。也就是说,您应该定义清漆在哪种情况下进行查找,传递或传递。
在您的情况下,您将拥有没有变更cookie的页面(案例1和2),每个人都会缓存和共享(带/不带cookie的请求);只是不介意vcl_recv中的req.http.Cookie。我不会用变化的cookie来缓存页面(案例3) - 或者至少不会很长时间 - 因为它们根本不能共享;在vcl_fetch中执行'pass'。