Кэширование

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

Кэширование в Nginx — встроенная возможность обратного прокси, которая сохраняет HTTP-ответы upstream на диске и в разделяемой памяти, позволяя веб-серверу обслуживать последующие идентичные запросы без обращения к бэкенду. Подсистема кэширования настраивается с помощью proxy_cache_path (задаёт расположение и размер кэш-зоны), proxy_cache (активирует кэш в блоке location) и proxy_cache_valid (устанавливает TTL для каждого кода ответа), образуя ядро конфигурации кэширования Nginx. При активном кэшировании переменная $upstream_cache_status отображает статус каждого ответа: HIT, MISS, BYPASS или EXPIRED — ценные метаданные для мониторинга производительности и отладки. Для PHP- или Node.js-приложений, стоящих за Nginx, модули fastcgi_cache и proxy_cache соответственно способны поглощать пики трафика, отдавая кэшированный HTML, JSON или статические ресурсы и резко снижая нагрузку на базы данных и серверы приложений. Правильная настройка кэширования в Nginx — включая адекватные правила proxy_cache_bypass, таймауты блокировки и поведение фонового обновления — является одной из наиболее высокоэффективных оптимизаций, доступных в развёртывании Nginx в роли обратного прокси.

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

Кэширование имеет несколько слоёв: 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;. 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 (разные запросы коллизятся).

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

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