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