.png)
Estou usando Django com Varnish 4.
Estou tentando conseguir isso:
- Se a solicitação não for para a página inicial, passe (estou tentando armazenar em cache apenas a página inicial no momento para testá-la, etc.)
- Se o cookie 'sessionid' estiver presente, passe ou armazene em cache para cada sessão
- Qualquer outra coisa: passe
Aqui está a configuração do sub vcl_recv:
# cache only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid is present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
Até agora, o Varnish parece sempre gerar uma nova página para cada uma delas ao chamar a página inicial como anônima. Posso dizer usando os cabeçalhos Varnish send (a 'idade' é sempre 0 e 'X-Varnish' é sempre um número diferente).
Ou está faltando alguma coisa na minha configuração ou é porque o Django envia um 'Vary: Cookie' na resposta? Se for o caso, como posso ‘ocultar’ cookies do Varnish neste caso (apenas para usuários anônimos)?
Responder1
O 'problema' foi que Django enviou um cabeçalho 'Vary: Cookie'o tempo todo. Acho que é por causa do plugin 'auth', mas não investiguei isso, apenas apaguei o cabeçalho quando a resposta voltou do servidor.
Aqui está o que o documento de Varnish tem a dizer sobre 'vary: cookie':
Outro exemplo de mau uso é quando se utiliza apenas Vary: Cookie para diferenciar uma resposta. Novamente, pode haver um número muito grande de cookies e, portanto, um número muito grande de objetos em cache, que provavelmente serão recuperados apenas pelos solicitantes originais.
Fonte:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary
Esta é a aparência da minha configuração VCL (removi a parte superior, que é simplesmente a configuração do servidor):
sub vcl_recv
{
# caching only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
}
sub vcl_backend_response
{
if (bereq.url == "/") {
unset beresp.http.Vary;
return(deliver);
}
}