Кэширование в Nginx
Как настроить кэширование страниц для ускорения сайта и снижения нагрузки.
При высокой посещаемости сайта сервер быстро расходует ресурсы на генерацию страниц. Кэширование в Nginx позволяет отдавать готовые ответы из памяти или диска, ускоряя отклик и разгружая PHP и базу данных.
NGINX может кэшировать:
- статические файлы (CSS, JS, изображения)
- динамические страницы (ответы PHP/CMS)
- ошибки (404, 502 и т.д.)
На VPS и выделенных серверах настройка полностью в ваших руках.
1. Настройка общего кэша (proxy_cache)
Откройте основной конфиг /etc/nginx/nginx.conf и добавьте в секцию http { ... }:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:32m inactive=60m max_size=2g;
/var/cache/nginx— папка для хранения кэша (создайте:sudo mkdir -p /var/cache/nginx)levels=1:2— структура папок (быстрее поиск)keys_zone=static_cache:32m— зона в памяти (32 МБ — имя и метаданные)inactive=60m— файлы удаляются, если к ним не обращались 60 минутmax_size=2g— максимальный размер кэша на диске
Создайте папку и установите права:
sudo mkdir -p /var/cache/nginx
sudo chown www-data:www-data /var/cache/nginx
2. Простое кэширование всего сайта (proxy_cache)
Создайте или отредактируйте конфиг сайта (например, /etc/nginx/sites-available/site.com).
Пример через кэширование всего трафика через прокси:
server {
listen 80;
server_name site.com www.site.com;
location / {
proxy_pass http://127.0.0.1:8080; # PHP-FPM или backend на другом порту
proxy_cache static_cache;
proxy_cache_valid 200 301 302 60m; # кэшируем успешные ответы на 60 минут
proxy_cache_valid 404 1m; # ошибки на 1 минуту
proxy_cache_methods GET HEAD; # кэшируем только GET и HEAD
proxy_ignore_headers Cache-Control Expires Set-Cookie;
proxy_cache_bypass $http_cookie; # не кэшируем, если есть куки
}
}
Наши услуги и сервисы
3. Кэширование fastcgi (ответов PHP)
Для кэширования динамических страниц (например, страниц CMS) используйте fastcgi_cache.
В секции http { ... } добавьте:
fastcgi_cache_path /var/cache/nginx-fcgi levels=1:2 keys_zone=fcgi_cache:100m inactive=60m max_size=5g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
Создайте папку:
sudo mkdir -p /var/cache/nginx-fcgi
sudo chown www-data:www-data /var/cache/nginx-fcgi
В блоке location ~ \.php$ основного сервера добавьте:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # или ваш сокет
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache fcgi_cache;
fastcgi_cache_valid 200 301 302 60m; # кэшируем успешные ответы на 60 минут
fastcgi_cache_valid 404 1m;
fastcgi_cache_bypass $http_cookie; # не кэшируем при наличии куки
fastcgi_no_cache $http_cookie; # не сохраняем в кэш при наличии куки
}
Полезные замечания
- Кэширование не должно применяться к страницам с авторизацией, личным кабинетом, корзиной — используйте
fastcgi_cache_bypassиfastcgi_no_cacheдля таких URI. - Для динамических сайтов (Bitrix, WordPress) часто кэшируют только GET-запросы без куки.
- После изменений перезапустите NGINX:
sudo nginx -t # проверка конфигурации
sudo systemctl reload nginx
- Очистка кэша вручную (если требуется):
sudo rm -rf /var/cache/nginx/*
sudo rm -rf /var/cache/nginx-fcgi/*
Помощь
Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!