Кэширование в 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;    # не кэшируем, если есть куки
    }
}

Наши услуги и сервисы

ХостингРаботает на сверхбыстрых NVMe дисках. Подходит для сайтов любой сложности.
Заказать
VPSМожно динамически менять параметры и гибко настраивать ОС. Бесплатное администрирование включено.
Заказать
Выделенные серверыДоступны различные сборки на базе Supermicro с процессорами Intel и AMD на борту.
Заказать

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/*

Помощь

Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!

Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам