让我用一个例子来解释:
文件: /etc/varnish/default.vcl
# [...]
sub vcl_recv {
# [...]
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.http.Authorization || req.http.Authenticate) {
return (pass);
}
if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)") {
return (pass);
}
# [...]
return (lookup);
}
sub vcl_fetch {
# [...]
if (req.request != "GET" && req.request != "HEAD") {
return (hit_for_pass);
}
if (req.http.Authorization || req.http.Authenticate) {
return (hit_for_pass);
}
if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)") {
return (hit_for_pass);
}
# [...]
return (deliver);
}
正如您所看到的,对于不应缓存的内容,我在vcl_recv
和vcl_fetch
下有相同的政策,但分别有return (pass);
和return (hit_for_pass);
。
在某些情况下,应该这样做(when it is useful),而其他情况则完全没必要。这些是什么? (例如Cookies?如果是,如何?)
答案 0 :(得分:1)
我真的不明白为什么会出现这种情况有用的原因。当VCL不知道生成的响应不能是缓存时,您可以创建命中传递对象。如果VCL可以认为我们不应该缓存响应,那么你应该只是通过"并完成它,避免整个命中通过创建。
所以,建议非常简单。你可以尽可能使用pass in recv,但是如果你不了解对象的高速缓存性,那么你应该回到使用Varnish创建点击传递对象,从而避免序列化事务。