Nginx ou cache Varnish com várias versões de um site

2

Eu tenho um site ( link ) que tem algumas versões. Há o site normal para computador, o mesmo site com um tema sombrio e o site para dispositivos móveis. Todos compartilham os mesmos URLs. O tema é selecionado com um cookie e a versão para celular é mostrada com base no agente do usuário.

Eu configurei o cache como visto aqui em nossa configuração do nginx . Podemos receber mais de 500 solicitações por segundo e precisamos manter muito desse tráfego longe do nosso back-end para que tudo fique saudável. Eu configurei isso com um cache de 1 ou 30 segundos (dependendo de qual parte do site está sendo armazenada em cache), mas isso tem o efeito colateral de colocar 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 armazenamento em cache para reconhecer essas situações diferentes como exclusivas? Anteriormente, o Varnish estava configurado entre o nginx e o backend, mas não fizemos nada de especial com ele. Será que talvez seja capaz de atender às nossas necessidades?

    
por Drew DeVault 17.05.2014 / 03:08

1 resposta

1

Aqui está uma implementação de exemplo usando cookies. Se o valor do cookie for um dos dark , light ou mobile , tentaremos veicular a página em cache. Para qualquer outro valor de cookie (incluindo nenhum valor) nós ignoramos o cache e supomos que o upstream irá configurar o cookie apropriado para que o próximo pedido use o cache.

Usamos proxy_cache_key para adicionar valor de cookie à chave de cache e proxy_cache_bypass para 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:

por 17.05.2014 / 17:54