cache bypass

Тема дорожной карты · Nginx

Обход кэша в Nginx — это механизм, который позволяет определённым запросам пропустить прокси-кэш и быть перенаправленными напрямую к вышестоящему бэкенду. Это особенно важно для гарантии, что аутентифицированные пользователи, POST-запросы или сессии с куками всегда получают свежие ответы. Директива proxy_cache_bypass принимает одну или несколько переменных; если хотя бы одна из них непуста или не равна нулю, Nginx пропускает чтение из кэша и передаёт запрос upstream. Например, proxy_cache_bypass $cookie_session $http_authorization; позволяет перенаправлять запросы, содержащие куки или заголовки аутентификации, напрямую к бэкенду, минуя кэш.

Тесно связанная директива proxy_no_cache управляет тем, следует ли сохранять ответ в кэше после ответа upstream. Это позволяет детально контролировать, какие данные попадают в кэш-зону. Правила обхода кэша обычно размещаются в блоке location вместе с proxy_cache, proxy_cache_valid и proxy_pass, образуя полную стратегию кэширования для конфигурации обратного прокси. Правильная настройка обхода кэша критически важна для конфигураций Nginx, где аутентифицированный и анонимный трафик используют один пул upstream.

Как это работает

Обход кэша в Nginx имеет несколько слоёв: proxy_cache (серверный кеш upstream-ответов на диск), fastcgi_cache (для PHP-FPM), Cache-Control / Expires заголовки (инструкции браузерам и CDN). Например, proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m; + proxy_cache mycache; + proxy_cache_valid 200 1h; создают конфигурацию кэширования, где ответы с кодом 200 сохраняются в кэше на один час. Директива proxy_cache_use_stale используется для управления stale-контентом во время сбоев backend.

Когда применять

Включайте proxy_cache для медленных upstream-ответов, где staleness секунд-минут допустим (рендеримые страницы, результаты поиска, дорогие вычисления). proxy_cache_lock on; может использоваться для предотвращения thundering herd при expire кеша. proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; обеспечивает устойчивость при различных ошибках backend. Cache-Control: public, max-age=... — это заголовок, который используется для управления кэшированием в браузерах и CDN.

Типичные ошибки

Одна из распространённых ошибок при использовании proxy_cache_bypass — кеширование аутентифицированных ответов. Это может привести к ситуации, когда один пользователь видит данные другого пользователя. В таких случаях всегда следует использовать директиву vary по кукам или полностью исключать из кэша запросы аутентифицированных пользователей. Другой распространённой ошибкой является использование слишком большого keys_zone, который превышает доступную RAM, что приводит к замедлению и нестабильности. Также важно не забывать указывать параметр inactive=, чтобы предотвратить бесконтрольный рост кеша. Наконец, ключ кэша не должен содержать только URL; важно учитывать параметры запроса, чтобы избежать коллизий между запросами.

Связанные понятия

Полезные ресурсы