Configuración de Varnish 4 VCL para almacenar en caché solo una página específica para usuarios anónimos (con Django)

Configuración de Varnish 4 VCL para almacenar en caché solo una página específica para usuarios anónimos (con Django)

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

información relacionada