
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_response
contexto. return(pass)
é usado vcl_recv
quando uma solicitação recebida ignora o cache.
Ignorar vcl_backend_response
o 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-Cookie
cabeçalho. Isso é feito corretamente em vcl_backend_response
through unset beresp.http.Set-Cookie
, porém isso é feito incondicionalmente.
Isso significa que nenhuma Set-Cookie
açã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_response
execução unset beresp.http.Cookie
.
Isso indicaria que um Cookie
cabeç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.