Зоны кэша
Тема дорожной карты · Nginx
Кэш-зона в Nginx — это область разделяемой памяти и связанное дисковое хранилище, определяемое директивой proxy_cache_path. Эта зона используется для кэширования ответов upstream, что позволяет Nginx эффективно обслуживать запросы обратного прокси без необходимости обращаться к бэкенду. Использование кэш-зон улучшает производительность и уменьшает нагрузку на серверы backend, что особенно важно в условиях высокой нагрузки и большого числа однотипных запросов.
Каждая кэш-зона определяется рядом параметров, таких как размер памяти для ключей, максимальный размер дискового хранилища и срок неактивности. Например, объявление proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; создаёт кэш-зону с именем my_cache, которая использует 10 МБ разделяемой памяти для ключей, до 1 ГБ дискового пространства и имеет срок неактивности в 60 минут. Этот параметр позволяет управлять тем, как долго кэш-зона будет хранить данные, которые не были использованы.
Для активации кэш-зоны в блоках server или location используется директива proxy_cache my_cache;. Это позволяет задать время жизни кэшированных ответов для различных HTTP-статусов, что обеспечивает детальный контроль над тем, какие ответы будут кэшироваться и насколько долго. Например, директивы proxy_cache_valid 200 302 10m; и proxy_cache_valid 404 1m; задают время жизни кэшированных ответов для статусов 200, 302 и 404 соответственно.
Кэш-зоны могут быть привязаны к конкретным виртуальным хостам или совместно использоваться несколькими upstream'ами, что делает их гибким инструментом для повышения производительности в нагруженных развёртываниях балансировки нагрузки и обратного прокси Nginx. Важно правильно выбрать размер памяти keys_zone и квоту диска max_size, чтобы предотвратить деградацию производительности из-за вытеснения записей и поддерживать высокий процент попаданий в кэш под продакшен-нагрузкой.
Как это работает
Зоны кэша имеют несколько слоёв: proxy_cache (server-side кеш 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; позволяет создать кэш-зону с именем mycache, которая будет использовать 10 МБ памяти для ключей и до 10 ГБ дискового пространства. proxy_cache_use_stale — для stale-контента во время сбоя backend.
Когда применять
Включайте proxy_cache для медленных upstream-ответов, где staleness секунд-минут допустим (rendered-страницы, search results, дорогие вычисления). Например, директива proxy_cache_lock on; используется для предотвращения thundering herd при expire кеша. proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; — для устойчивости. Cache-Control: public, max-age=... — для browser/CDN-кеша.
Типичные ошибки
Ловушки Зоны кэша включают кеширование аутентифицированных ответов (один юзер видит данные другого — всегда vary по cookie или skip cache для залогиненных); огромный keys_zone, превышающий RAM (медленно + нестабильно); отсутствие параметра inactive= (кеш растёт без границ); использование cache key, включающего только URL, когда важны query params (разные запросы коллизируются).