FASTCGI_CACHE_MISS
Linux / DevOps
Оптимизация кэширования в Nginx: статический контент и FastCGI-кэш
- Высокая утилизация CPU бэкендом (PHP-FPM, Python, Node.js) при повторяющихся GET-запросах.
- Медленная отдача статических ассетов (изображения, шрифты, CSS/JS).
- Падение производительности веб-сервера при наплыве неавторизованных пользователей (эффект Slashdot).
1. Оптимизация отдачи статических файлов
В файле конфигурации хоста:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform, immutable";
access_log off;
log_not_found off;
tcp_nodelay off;
open_file_cache max=10000 inactive=120s;
open_file_cache_valid 180s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}2. Настройка полностраничного FastCGI кэширования
В секции http файла /etc/nginx/nginx.conf:
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=WORDPRESS_CACHE:100m inactive=60m max_size=2g use_temp_path=off;3. Конфигурация location для PHP скриптов
# Инициализация зоны кэша
fastcgi_cache WORDPRESS_CACHE;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# Не кэшировать POST запросы и пользователей с куками авторизации
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($http_cookie ~* "comment_author|wordpress_logged_in") { set $skip_cache 1; }
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_valid 200 301 302 30m;
fastcgi_cache_valid 404 1m;
# Отдача устаревшего кэша при сбое бэкенда (Отказоустойчивость)
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
# Заголовок со статусом кэша (HIT, MISS, BYPASS)
add_header X-FastCGI-Cache $upstream_cache_status;
Практический опыт инженера:
Всегда указывайте use_temp_path=off в fastcgi_cache_path. Это заставляет Nginx сразу писать временные файлы в целевую папку кэша без двойного копирования через /var/lib/nginx/tmp/.
Частые вопросы (FAQ)
Что дает fastcgi_cache_use_stale updating?
Если срок жизни кэша истек, Nginx отдаст старую страницу клиентам, пока только один фоновый запрос обновляет кэш с бэкенда. Это предотвращает перегрузку сервера одновременными запросами (Cache Stampede).
Как очистить FastCGI кэш вручную?
Удалите содержимое папки кэша: rm -rf /var/cache/nginx/fastcgi/* && systemctl reload nginx.