O que esse bloco de código de verniz faz?

O que esse bloco de código de verniz faz?

Eu tenho esse código na configuração do verniz e não tenho certeza do que ele faz! Esta configuração irá armazenar em cache ou não as solicitações do meu cliente? o que está errado com isso?

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);
}

Responder1

Este bloco de código VCL parece especificar algumas regras sobre quando ignorar o cache. No entanto, a forma como está escrito não faz muito sentido.

Ignorando o cache

return(pass)não é a maneira correta de ignorar o cache no vcl_backend_responsecontexto. return(pass)é usado vcl_recvquando uma solicitação recebida ignora o cache.

Ignorar vcl_backend_responseo cache significa impedir o armazenamento do objeto recebido no cache. As melhores práticas determinam que você faça isso set beresp.uncacheable = true, atribua um TTL e então return(deliver). Isso garante que esse objeto ignore o cache por um determinado período de tempo até que a próxima resposta de back-end atenda aos critérios exigidos.

Ao habilitar beresp.uncacheable, você está garantindo que o objeto acabe na lista de espera e se torne um candidato à coalescência de solicitações.

Removendo cookies

A remoção de cookies geralmente faz sentido para melhorar sua taxa de acerto. No contexto de back-end, você removerá o Set-Cookiecabeçalho. Isso é feito corretamente em vcl_backend_responsethrough unset beresp.http.Set-Cookie, porém isso é feito incondicionalmente.

Isso significa que nenhuma Set-Cookieação ocorrerá, o que poderia resultar em comportamento inconsistente. Não tenho certeza se são necessárias pré-condições para a remoção desses cookies.

Você também pode remover cookies recebidos através do unset req.http.Cookie. Mas parece haver uma chamada semelhante em vcl_backend_responseexecução unset beresp.http.Cookie.

Isso indicaria que um Cookiecabeçalho de resposta seria recebido. Isso parece improvável.

Reescrevendo a VCL

É assim que eu reescreveria este código VCL sem qualquer outro contexto:

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);
}

Aviso: eu não recomendaria copiar/colar isso em seu ambiente de produção. Tenho a sensação de que alguns atalhos foram cortados ao escrever esta VCL. Como não tenho nenhum contexto adicional, não quero aconselhar o uso disso.

informação relacionada