Cache-Control заголовки
Тема дорожной карты · Nginx
Заголовки Cache-Control — это директивы HTTP-ответа, которые сообщают браузерам, CDN и промежуточным обратным прокси, включая Nginx, как долго и при каких условиях ответ может храниться и повторно использоваться. В Nginx заголовки Cache-Control добавляются или изменяются директивой add_header Cache-Control "public, max-age=31536000, immutable"; — как правило, в блоке location для статических ресурсов: бандлов JavaScript или изображений, раздаваемых веб-сервером. Для динамического контента, проксируемого к вышестоящему приложению, Nginx можно настроить так, чтобы он уважал директивы Cache-Control: no-store или private upstream'а через proxy_ignore_headers и proxy_hide_header, давая операторам точный контроль над поведением кэша. Правильная установка заголовков Cache-Control тесно связана с директивой proxy_cache_valid: если upstream не включает заголовки кэширования, Nginx использует настроенные значения proxy_cache_valid в качестве резервных TTL внутри кэш-зоны. Грамотно спроектированная стратегия заголовков Cache-Control снижает нагрузку на origin, улучшает производительность SSL/TLS за счёт уменьшения числа обращений и является ключевым аспектом оптимизации производительности Nginx.
Как это работает
Cache-Control заголовки имеет несколько слоёв: 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-кеша.
Типичные ошибки
Ловушки Cache-Control заголовки: кешируют аутентифицированные ответы (один юзер видит данные другого — всегда vary по cookie или skip cache для залогиненных); огромный keys_zone, превышающий RAM (медленно + нестабильно); нет inactive= (кеш растёт без границ); cache key включает только URL, когда важны query params (разные запросы коллизятся).