这段 varnish 代码起什么作用?

这段 varnish 代码起什么作用?

我在 varnish 配置中有此代码,但不确定它有什么用!此配置是否会缓存我的客户端请求?它有什么问题?

sub vcl_backend_response {
    if (beresp.status != 200) {
        return (pass);
    }
    set beresp.http.X-Backend = beresp.backend.name;


    unset beresp.http.cookie;
    unset beresp.http.Set-Cookie;

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.http.Cache-Control = "no-store";
    }

    set beresp.http.Cache-Control = "no-store";
    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        return (pass);
    }

    return (deliver);
}

答案1

这段 VCL 代码似乎指定了一些何时绕过缓存的规则。但是,它的编写方式不太合理。

绕过缓存

return(pass)不是在vcl_backend_response上下文中绕过缓存的正确方法。return(pass)用于vcl_recv当传入请求绕过缓存时。

绕过vcl_backend_response缓存意味着阻止将传入对象存储在缓存中。最佳实践要求您执行set beresp.uncacheable = true,分配 TTL,然后return(deliver)。这可确保此对象在一定时间内绕过缓存,直到下一个后端响应满足所需条件。

通过我的启用beresp.uncacheable,您可以确保对象最终进入等待列表并成为请求合并的候选对象。

删除 Cookie

删除 cookie 通常有助于提高命中率。在后端上下文中,您将删除标头。这在throughSet-Cookie中可以正确完成,但这是无条件完成的。vcl_backend_responseunset beresp.http.Set-Cookie

这意味着Set-Cookie不会执行任何操作,这可能会导致不一致的行为。不确定删除这些 cookie 是否需要先决条件。

您还可以通过 删除传入的 cookie 。但运行unset req.http.Cookie中似乎有一个类似的调用。vcl_backend_responseunset beresp.http.Cookie

这表明Cookie将收到响应标头。这似乎不太可能。

重写 VCL

这是我在没有任何其他上下文的情况下重写此 VCL 代码的方法:

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {
    unset req.http.Cookie;
}

sub vcl_backend_response {
    if(beresp.status != 200) {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    set beresp.http.X-Backend = beresp.backend.name;
    unset beresp.http.Set-Cookie;
    set beresp.http.Cache-Control = "no-store";

    if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
        set beresp.ttl = 120s;
        set beresp.uncacheable = true;
        return(deliver);
    }

    return (deliver);
}

警告:我不建议将此代码复制/粘贴到您的生产环境中。我感觉在编写此 VCL 时有些偷工减料。由于我没有任何其他背景信息,因此我不建议使用此代码。

相关内容