Cache Nginx ou Varnish com múltiplas versões de um site

Cache Nginx ou Varnish com múltiplas versões de um site

Eu tenho um site (https://mediacru.sh) que possui algumas versões. Existe o site normal para desktop, o mesmo site com tema sombrio e o site para celular. Todos eles compartilham os mesmos URLs. O tema é selecionado com um cookie e a versão mobile é mostrada com base no agente do usuário.

Eu configurei o cache como vistoaqui em nossa configuração nginx. Podemos receber mais de 500 solicitações por segundo e preciso manter grande parte desse tráfego longe de nosso back-end para que tudo permaneça íntegro. Eu configurei-o com um cache de 1 ou 30 segundos (dependendo de qual parte do site está sendo armazenada em cache), mas isso tem o infeliz efeito colateral de armazenar em cache a página de um usuário e servir a página errada para outra pessoa.

O que posso fazer para ajustar o cache para reconhecer essas diferentes situações como únicas? Anteriormente, tínhamos o Varnish configurado entre o nginx e o back-end, mas não fizemos nada de especial com ele. Será que seria capaz de atender às nossas necessidades?

Responder1

Aqui está um exemplo de implementação usando cookie. Se o cookie tiver um valor entre dark, lightou mobiletentaremos servir a página em cache. Para qualquer outro valor de cookie (incluindo nenhum valor), ignoramos o cache e supomos que o upstream definirá o cookie apropriado para que a próxima solicitação use o cache.

Usamos proxy_cache_keypara adicionar o valor do cookie à chave de cache e proxy_cache_bypasspara ignorar o cache se o cookie não estiver no 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;
    }
}

Manuais:

informação relacionada