.png)
Estoy usando Django con Varnish 4.
Estoy tratando de lograr eso:
- Si la solicitud no es para la página de inicio, pase (estoy intentando almacenar en caché solo la página de inicio en este momento para probarla, etc.)
- Si la cookie 'sessionid' está presente, pase o almacene en caché para cada sesión
- Cualquier otra cosa: pasar
Aquí está la configuración de 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;
Hasta ahora, Varnish parece generar siempre una nueva página para cada vez que llama a la página de inicio como anónima. Puedo saberlo usando los encabezados de envío de Varnish (la 'edad' es siempre 0 y 'X-Varnish' es siempre un número diferente).
¿Es que a mi configuración le falta algo o es porque Django envía un 'Vary: Cookie' en la respuesta? Si es así, ¿cómo puedo "ocultar" las cookies de Varnish en este caso (sólo para usuarios anónimos)?
Respuesta1
El 'problema' fue que Django envió un encabezado 'Vary: Cookie'todo el tiempo. Creo que se debe al complemento 'auth', pero no investigué eso, simplemente eliminé el encabezado cuando llegó la respuesta del servidor.
Esto es lo que el documento de Varnish tiene que decir sobre 'vary: cookie':
Otro ejemplo de mal uso es cuando se usa solo Vary: Cookie para diferenciar una respuesta. Nuevamente, podría haber una gran cantidad de cookies y, por lo tanto, una gran cantidad de objetos almacenados en caché, que probablemente solo serán recuperados por sus solicitantes originales.
Fuente:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary
Así es como se ve mi configuración VCL (eliminé la parte superior que es simplemente la configuración del 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);
}
}