У меня есть сайт (https://mediacru.sh), у которого есть несколько версий. Есть обычный сайт для ПК, тот же сайт с темной темой и сайт для мобильных устройств. Все они имеют одни и те же URL-адреса. Тема выбирается с помощью файла cookie, и мобильная версия отображается в зависимости от пользовательского агента.
Я настроил кеширование, как показано здесь в нашей конфигурации nginx. Мы можем получать более 500 запросов в секунду, и мне нужно держать большую часть этого трафика подальше от нашего бэкэнда, чтобы все оставалось исправным. Я установил для него 1 или 30 секундный кеш (в зависимости от того, какая часть сайта кэшируется), но это имеет неприятный побочный эффект, заключающийся в кешировании страницы одного пользователя и передаче неправильной страницы кому-то другому.
Что я могу сделать, чтобы настроить кеширование, чтобы распознавать эти разные ситуации как уникальные? Ранее у нас был установлен Varnish между nginx и серверной частью, но мы не сделали с ним ничего особенного. Может ли это удовлетворить наши потребности?
Вот пример реализации с использованием cookie. Если значение cookie одно из dark
, light
или mobile
мы пытаемся обслуживать кешированную страницу. Для любого другого значения cookie (включая отсутствие значения) мы обходим кеш и предполагаем, что восходящий поток установит соответствующий файл cookie, поэтому следующий запрос будет использовать кеш.
Мы используем proxy_cache_key
добавить значение cookie в ключ кеширования и proxy_cache_bypass
чтобы пропустить кеш, если cookie не входит в набор предопределенных значений.
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;
}
}
Руководства: