Назад | Перейти на главную страницу

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

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

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