fastcgi_cache
Тема дорожной карты · Nginx
FastCGI-кэш в Nginx представляет собой мощный инструмент для ускорения обработки запросов к веб-приложениям, особенно в контексте PHP-приложений. Он позволяет серверу хранить и повторно использовать ответы от PHP-FPM или других FastCGI-бэкендов, что значительно снижает нагрузку на сервер и ускоряет отдачу данных. Это особенно полезно для сайтов с высокой нагрузкой, где повторяющиеся запросы могут быть обработаны без необходимости выполнения PHP-скриптов заново.
Для настройки FastCGI-кэша используется директива fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fastcgi_cache:10m max_size=500m inactive=60m; в блоке http. Эта директива определяет путь к кэшу, количество уровней директорий для хранения данных, размер зоны ключей и максимальный размер кэша. В блоке location ~ \.php$ активируется FastCGI-кэш для PHP-ответов с помощью директив fastcgi_cache fastcgi_cache; и fastcgi_cache_valid 200 10m;. Ключ кэша задаётся через fastcgi_cache_key "$scheme$request_method$host$request_uri";, что позволяет уникально идентифицировать каждый запрос. Переменная $upstream_cache_status отражает статус кэширования (HIT, MISS или BYPASS) в журнале доступа, что делает поведение кэша полностью наблюдаемым и контролируемым.
Кроме того, правила обхода кэша через fastcgi_cache_bypass $cookie_PHPSESSID; гарантируют, что аутентифицированные сессии WordPress или Drupal всегда получают некэшированные персонализированные ответы, тогда как анонимные просмотры страниц обслуживаются с диска. Это позволяет улучшить пользовательский опыт, обеспечивая быстрый доступ к данным для анонимных пользователей и сохраняя персонализированные данные для залогиненных пользователей.
FastCGI-кэш — это одна из наиболее эффективных оптимизаций производительности Nginx для PHP-CMS-платформ, способная снизить нагрузку на сервер на порядок на контентно-насыщенных сайтах. Он значительно ускоряет время отклика сервера и уменьшает количество выполнений PHP-скриптов, что снижает нагрузку на сервер и улучшает производительность сайта.
Как это работает
FastCGI-кэш состоит из нескольких слоёв: proxy_cache (серверный кэш upstream-ответов на диск), fastcgi_cache (для PHP-FPM), Cache-Control / Expires заголовки (инструкции браузерам и CDN). Для настройки proxy_cache используется директива 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 позволяет использовать устаревший кеш во время сбоев backend, обеспечивая устойчивость системы.
Когда применять
proxy_cache следует использовать для медленных upstream-ответов, где устаревание контента на несколько секунд или минут допустимо (рендеримых страниц, результатов поиска, дорогих вычислений). Для предотвращения проблемы thundering herd при истечении срока действия кеша, можно использовать директиву proxy_cache_lock on;. Для повышения устойчивости системы, следует использовать директиву proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;. Для настройки кэширования браузерами и CDN, можно использовать заголовок Cache-Control: public, max-age=....
Типичные ошибки
Типичные ошибки при использовании FastCGI-кэша включают кеширование аутентифицированных ответов (один пользователь видит данные другого — всегда vary по cookie или skip cache для залогиненных); использование слишком большого keys_zone, превышающего объём RAM (медленно + нестабильно); отсутствие параметра inactive= (кеш растёт без границ); использование ключа кэша, который включает только URL, когда важны параметры запроса (разные запросы могут коллизироваться).