什么时候应该在vcl_recv和vcl_fetch下添加相同的策略?

时间:2014-06-11 12:19:56

标签: caching reverse-proxy varnish varnish-vcl

让我用一个例子来解释:

文件: /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_recvvcl_fetch下有相同的政策,但分别有return (pass);return (hit_for_pass);

在某些情况下,应该这样做(when it is useful),而其他情况则完全没必要。这些是什么? (例如Cookies?如果是,如何?)

1 个答案:

答案 0 :(得分:1)

我真的不明白为什么会出现这种情况有用的原因。当VCL不知道生成的响应不能是缓存时,您可以创建命中传递对象。如果VCL可以认为我们不应该缓存响应,那么你应该只是通过"并完成它,避免整个命中通过创建。

所以,建议非常简单。你可以尽可能使用pass in recv,但是如果你不了解对象的高速缓存性,那么你应该回到使用Varnish创建点击传递对象,从而避免序列化事务。