
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
, light
ou mobile
tentaremos 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_key
para adicionar o valor do 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: