Almacenamiento en caché de Nginx o Varnish con múltiples versiones de un sitio

Almacenamiento en caché de Nginx o Varnish con múltiples versiones de un sitio

Tengo un sitio web (https://mediacru.sh) que tiene algunas versiones. Está el sitio de escritorio normal, el mismo sitio con un tema oscuro y el sitio móvil. Todos comparten las mismas URL. El tema se selecciona con una cookie y la versión móvil se muestra según el agente de usuario.

He configurado el almacenamiento en caché como se veaquí en nuestra configuración de nginx. Podemos recibir más de 500 solicitudes por segundo y necesito mantener gran parte de ese tráfico alejado de nuestro backend para que todo se mantenga en buen estado. Lo configuré con un caché de 1 o 30 segundos (dependiendo de qué parte del sitio se esté almacenando en caché), pero esto tiene el desafortunado efecto secundario de almacenar en caché la página de un usuario y mostrar la página incorrecta a otra persona.

¿Qué puedo hacer para ajustar el almacenamiento en caché para reconocer estas diferentes situaciones como únicas? Anteriormente habíamos configurado Varnish entre nginx y el backend, pero no hicimos nada especial con él. ¿Quizás podría satisfacer nuestras necesidades?

Respuesta1

A continuación se muestra un ejemplo de implementación utilizando cookies. Si el valor de la cookie es uno de dark, lighto mobileintentamos servir la página en caché. Para cualquier otro valor de cookie (incluido ningún valor), omitimos el caché y suponemos que el flujo ascendente establecerá la cookie adecuada para que la próxima solicitud utilice el caché.

Usamos proxy_cache_keypara agregar valor de cookie a la clave de caché y proxy_cache_bypassomitir el caché si la cookie no está en un conjunto de valores predefinidos.

map $cookie_theme $cache_bypass {
    default "1";
    "dark"      "0";
    "light"     "0";
    "mobile"    "0";
}

proxy_cache_path /var/tmp/nginx levels=1 keys_zone=test-cache:10m;

server {
    listen 80;
    server_name test-cache.localhost;

    location / {
        proxy_pass http://test-cache;

        proxy_cache test-cache;
        proxy_cache_valid 1m;
        proxy_cache_key "$host$request_uri $cookie_theme";
        proxy_cache_bypass $cache_bypass;
    }
}

Manuales:

información relacionada