2010-11-25 13 views
16

Deseo utilizar Varnish para almacenar en caché ciertas páginas incluso en presencia de cookies. Hay 3 posibilidades que tengo que cuidar de:Cómo hacer que Varnish ignore, no elimine las cookies

  1. Un usuario anónimo está viendo alguna página
  2. Una conectado usuario está viendo alguna página con personalización de la luz. Estas personalizaciones están todas almacenadas en una cookie firmada y están rellenas dinámicamente por Javascript. El encabezado http de cookie variable no está configurado.
  3. Un usuario que ha iniciado sesión está viendo una página con datos personalizados de la base de datos. Se establece el encabezado http de cookie variable.

Los comportamientos esperados serían:

  1. caché de la página. Este es el escenario más básico para que lo maneje Varnish.
  2. Guarde en caché la página y no elimine la cookie porque algo de la lógica de Javascript lo necesita.
  3. Nunca guarde en caché esta página porque vary-cookie indica que los contenidos de la cookie afectarán el resultado de esta página.

He leído algunos documentos en Varnish y no puedo decir si este es el comportamiento predeterminado o si hay alguna configuración que tengo que hacer en VCL para hacerlo realidad.

+1

Cerrado como publicación entre sitios: http://serverfault.com/q/205768/72348 – casperOne

Respuesta

17

Solo las sesiones son únicas para cada cliente, no necesariamente las cookies.

Lo que necesita tiene sentido y es posible con Barniz, es solo cuestión de crear cuidadosamente su propio vcl. Por favor, preste atención a las siguientes partes de la default.vcl:

sub vcl_recv { 
    ... 
    if (req.http.Authorization || req.http.Cookie) { 
     /* Not cacheable by default */ 
     return (pass); 
    } 
} 


sub vcl_hit { 
    if (!obj.cacheable) { 
     return (pass); 
    } 
    ... 
} 


sub vcl_fetch { 
    if (!beresp.cacheable) { 
     return (pass); 
    } 
    if (beresp.http.Set-Cookie) { 
     return (pass); 
    } 
    ... 
} 

tiene que sustituir estas piezas con su propia lógica; es decir, defina sus propias funciones vcl_. Por defecto, las solicitudes (vcl_recv) y las respuestas (vcl_fetch) con cookies no son almacenables. Usted conoce mejor su aplicación de back-end y debe volver a escribir la lógica genérica de caché para este caso específico. Es decir, debe definir en qué caso el barniz hace una búsqueda, pasa o entrega.

En su caso, tendrá páginas (casos 1 y 2) sin una cookie de modificación, que será almacenada en caché y compartida por todos (solicitudes con/sin cookies); simplemente no me importa req.http.Cookie en vcl_recv. No almacenaría en caché las páginas (caso 3) con una cookie variable, o al menos no por un tiempo prolongado, ya que no pueden compartirse en absoluto; hacer un 'pase' en vcl_fetch.

+0

Así que en * vcl_fetch *, me gustaría hacer: * if (beresp.http.Vary ~ "Cookie") { regreso (pase); } *. –

+1

Sí. Y en vcl_recv no debe recurrir al comportamiento predeterminado, pero realice una búsqueda "par" si se ha configurado req.http.Cookie. No entiendo completamente su aplicación, pero me gustaría tener cuidado con las respuestas de almacenamiento en caché que hacen un Set-Cookie. Tiene sentido hacer un conjunto de cosas de cookies (y no almacenar en caché esto), y servir respuestas almacenadas en caché con javascript que hace cosas basadas en valores de cookies (simplemente verifique de cerca dónde 'confía' en el cliente). – ivy

+0

Estoy teniendo casi el mismo problema aquí. Mi vcl_recv finaliza con un retorno (búsqueda), y mi vcl_fetch es este: sub vcl_fetch { \t if (req.backend == dinamic) { \t \t esi; \t} \t if (req.backend == static) { \t \t unset beresp.http.set-cookie; \t}} pero aún así, todas las solicitudes al back-end dinámico (que deberían estar en caché) no son ... ¿alguna idea? Estoy tratando de usar esi para hacer un almacenamiento en caché personalizado, pero se está volviendo inútil ya que barniz no está almacenando en caché nada que provenga de la salida de mi aplicación. – Tiago

Cuestiones relacionadas