Что делает этот блок кода лака?

Что делает этот блок кода лака?

У меня есть этот код в конфигурации 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, вы гарантируете, что объект попадет в список ожидания и станет кандидатом на объединение запросов.

Удаление куки

Удаление куки часто имеет смысл для улучшения вашего показателя попаданий. В контексте бэкэнда вы удалите заголовок Set-Cookie. Это правильно сделано в vcl_backend_responseчерез unset beresp.http.Set-Cookie, однако это делается безусловно.

Это означает, что никаких Set-Cookieдействий не будет, что может привести к непоследовательному поведению. Не уверен, требуются ли предварительные условия для удаления этих файлов cookie.

Вы также можете удалить входящие куки через unset req.http.Cookie. Но, похоже, есть похожий вызов, vcl_backend_responseкоторый запускается unset 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 были срезаны некоторые углы. Поскольку у меня нет дополнительного контекста, я не хочу советовать использовать это.

Связанный контент