Кэширование Nginx или Varnish с несколькими версиями сайта

Кэширование Nginx или Varnish с несколькими версиями сайта

У меня есть веб-сайт (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;
    }
}

Руководства:

Связанный контент