Введение: зачем очищать кэш Nginx
Nginx кэширует ответы бэкенда, чтобы снизить нагрузку на PHP-FPM, приложения и базы данных. Кэш ускоряет доставку контента, но устаревшие данные создают проблемы: пользователи видят старую версию страницы, на диске заканчивается место, а после обновления сайта изменения не отображаются. Очистка кэша решает эти задачи без остановки сервера.
В этом руководстве вы получите готовые команды для очистки всех типов кэша Nginx: FastCGI, proxy, uwsgi и scgi. Разберём, как найти каталог кэша в конфигурации, безопасно удалить файлы, настроить автоматическую очистку через cron и проверить результат. Материал рассчитан на системных администраторов и DevOps-инженеров, которым нужен быстрый и надёжный способ поддерживать актуальность данных.
Если вы работаете с кэшем статики и изображений, обратитесь к отдельному руководству по управлению кэшем статики в Nginx. Для углублённой диагностики ошибок после очистки используйте материал по типичным проблемам при очистке кэша.
Типы кэша в Nginx и их расположение
Nginx поддерживает четыре типа кэша, каждый из которых настраивается отдельной директивой с указанием пути к каталогу хранения:
- FastCGI-кэш - для ответов от PHP-FPM и других FastCGI-серверов, задаётся директивой
fastcgi_cache_path. - Proxy-кэш - для ответов от проксируемых HTTP-серверов, задаётся директивой
proxy_cache_path. - uwsgi-кэш - для ответов от uWSGI-приложений, задаётся директивой
uwsgi_cache_path. - SCGI-кэш - для ответов от SCGI-серверов, задаётся директивой
scgi_cache_path.
Каждая директива принимает обязательный параметр - абсолютный путь к каталогу, где Nginx будет хранить файлы кэша. Этот путь вы определяете сами при настройке кэширования, поэтому универсального расположения не существует.
Как найти путь к каталогу кэша в конфигурации
Самый быстрый способ - выполнить поиск по конфигурационным файлам Nginx. Обычно они находятся в /etc/nginx/. Используйте команду:
grep -r "cache_path" /etc/nginx/Вывод покажет все директивы с путями. Например:
/etc/nginx/nginx.conf:proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=my_proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;
/etc/nginx/sites-available/site.conf:fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=my_fastcgi_cache:10m max_size=1g inactive=30m;В этом примере proxy-кэш хранится в /var/cache/nginx/proxy, а FastCGI-кэш - в /var/cache/nginx/fastcgi. Если путь относительный, Nginx интерпретирует его относительно префикса сборки, но на практике в директивах cache_path почти всегда указывают абсолютный путь.
Проверьте, что каталог существует и доступен для чтения:
ls -la /var/cache/nginx/proxyЕсли каталога нет, кэширование не настроено или Nginx ещё не создал его. В этом случае очистка не требуется.
Структура каталога кэша и имена файлов
Nginx организует файлы кэша в иерархию подкаталогов на основе хэша ключа кэша. Параметр levels=1:2 в директиве cache_path задаёт глубину вложенности: первый уровень - один символ, второй - два символа. Например, файл с хэшем a1b2c3d4e5f6... будет лежать по пути /var/cache/nginx/proxy/a/1b/a1b2c3d4e5f6....
Имена файлов не несут смысловой нагрузки - это просто хэши ключей. Поэтому точечная очистка по имени файла без вычисления хэша невозможна. Для массовой очистки удаляют все файлы в каталоге кэша, для выборочной - вычисляют хэш конкретного ключа и удаляют один файл.
Проверить объём занятого места можно командой:
du -sh /var/cache/nginx/proxyЕсли каталог занимает десятки гигабайт, а параметр max_size не ограничивает рост, очистка освободит дисковое пространство.
Безопасная очистка кэша без остановки сервера
Удаление файлов кэша безопасно: Nginx создаст их заново при следующем запросе. Перезапуск сервера не требуется. Важно удалять только содержимое каталога кэша, а не сам каталог, чтобы Nginx не потерял точку монтирования и права доступа.
Две основные команды для очистки:
rm -rf /path/to/cache/*или
find /path/to/cache -type f -deleteКоманда find предпочтительнее при большом количестве файлов: она не упирается в лимит длины списка аргументов. Перед выполнением убедитесь, что вы указали правильный путь. Ошибка в пути может привести к удалению не тех данных.
Очистка кэша FastCGI
Предположим, в конфигурации задан путь:
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=FASTCGI_CACHE:100m inactive=60m;Очистка выполняется командой:
find /var/cache/nginx/fastcgi -type f -deleteПосле удаления Nginx начнёт наполнять кэш заново при поступлении запросов. Первые запросы после очистки будут медленнее, так как сервер обратится к бэкенду.
Для точечной очистки FastCGI-кэша в WordPress и PHP-FPM используйте проверенные методы из руководства по очистке кэша FastCGI без простоя.
Очистка proxy-кэша
Для конфигурации:
proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=PROXY_CACHE:10m max_size=10g inactive=60m use_temp_path=off;Команда очистки:
find /var/cache/nginx/proxy -type f -deleteProxy-кэш часто очищают после обновления бэкенда, когда нужно немедленно отдать пользователям свежую версию API или динамического сайта. Если вы управляете прокси-кэшем, дополнительно изучите материал по ручной очистке кэша через командную строку.
Очистка кэша uwsgi и scgi
Процесс аналогичен. Для uwsgi-кэша с путём /var/cache/nginx/uwsgi:
find /var/cache/nginx/uwsgi -type f -deleteДля scgi-кэша с путём /var/cache/nginx/scgi:
find /var/cache/nginx/scgi -type f -deleteПроверьте права доступа перед удалением. Файлы кэша принадлежат пользователю, под которым работает Nginx (обычно www-data или nginx). Если вы выполняете команду от обычного пользователя, добавьте sudo:
sudo find /var/cache/nginx/proxy -type f -deleteВыборочная очистка кэша по ключу
Полная очистка удаляет весь кэш, что увеличивает нагрузку на бэкенд после инвалидации. Если нужно обновить только одну страницу или один URL, используют выборочную очистку по ключу кэша.
Ключ кэша задаётся директивой proxy_cache_key для proxy-кэша или аналогичными директивами для других типов. Типичное значение:
proxy_cache_key "$scheme$request_method$host$request_uri";Nginx вычисляет MD5-хэш от строки ключа и использует его для построения пути к файлу кэша. Чтобы удалить кэш для конкретного URL, нужно вычислить этот хэш.
Вычисление хэша ключа кэша
Соберите строку ключа в соответствии с директивой proxy_cache_key. Для URL https://example.com/page при ключе $scheme$request_method$host$request_uri строка будет httpsGETexample.com/page. Вычислите MD5:
echo -n "httpsGETexample.com/page" | md5sumВывод покажет хэш, например a1b2c3d4e5f6789.... Первый символ хэша определяет подкаталог первого уровня, следующие два - второго уровня, если задано levels=1:2.
Удаление конкретного файла кэша
Полный путь к файлу для хэша a1b2c3d4e5f6789... при levels=1:2 и каталоге /var/cache/nginx/proxy:
/var/cache/nginx/proxy/a/1b/a1b2c3d4e5f6789...Удалите файл:
rm /var/cache/nginx/proxy/a/1b/a1b2c3d4e5f6789...При следующем запросе Nginx обратится к бэкенду и создаст новый файл кэша. Этот метод экономит ресурсы, но требует точного воспроизведения строки ключа. Если в ключе есть переменные, значения которых зависят от запроса, вычислить хэш вручную сложнее. В таких случаях проще использовать модуль ngx_cache_purge или полную очистку.
Автоматизация очистки кэша с помощью cron
Регулярная очистка предотвращает накопление устаревших данных и освобождает дисковое пространство. Cron запускает команды по расписанию без участия администратора. Настройка занимает несколько минут.
Пример cron-задачи для очистки кэша
Откройте crontab для редактирования:
crontab -eДобавьте строку для ежедневной очистки proxy-кэша в 3 часа ночи:
0 3 * * * find /var/cache/nginx/proxy -type f -deleteФормат cron: минуты (0), часы (3), день месяца (*), месяц (*), день недели (*). Ночное время снижает влияние на пользователей, так как нагрузка на бэкенд после очистки временно возрастает.
Для еженедельной очистки в воскресенье в 4:30:
30 4 * * 0 find /var/cache/nginx/fastcgi -type f -deleteДобавьте логирование, чтобы контролировать выполнение:
0 3 * * * find /var/cache/nginx/proxy -type f -delete >> /var/log/nginx-cache-clean.log 2>&1Очистка кэша нескольких сайтов одной задачей
На сервере с несколькими сайтами каталоги кэша могут быть разными. Объедините очистку в один скрипт:
#!/bin/bash
find /var/cache/nginx/proxy -type f -delete
find /var/cache/nginx/fastcgi -type f -delete
find /var/cache/nginx/uwsgi -type f -deleteСохраните скрипт, например /usr/local/bin/clear-nginx-cache.sh, сделайте исполняемым и добавьте в cron:
chmod +x /usr/local/bin/clear-nginx-cache.sh
crontab -e
0 3 * * * /usr/local/bin/clear-nginx-cache.shБолее детально автоматизация разобрана в руководстве по настройке cron-задач и скриптов для очистки кэша.
Проверка очистки кэша
После выполнения команды удаления убедитесь, что каталог пуст:
ls -la /var/cache/nginx/proxyЕсли вывод пустой или содержит только подкаталоги без файлов, очистка прошла успешно. Проверьте освободившееся место:
du -sh /var/cache/nginx/proxyЧтобы убедиться, что Nginx снова кэширует ответы, добавьте в конфигурацию заголовок статуса кэша:
add_header X-Cache-Status $upstream_cache_status;После перезагрузки Nginx выполните запрос к сайту и проверьте заголовок:
curl -I https://example.com/page | grep X-Cache-StatusЗначение MISS означает, что кэш пуст и Nginx обратился к бэкенду. Повторный запрос должен вернуть HIT - ответ взят из кэша. Это подтверждает, что кэширование работает корректно.
Возможные ошибки и их решение
При очистке кэша возникают типичные проблемы. Разберём две самые частые.
Ошибка: Permission denied при удалении
Файлы кэша принадлежат пользователю, под которым работает Nginx. Если вы выполняете команду от другого пользователя, получите Permission denied. Решение - использовать sudo:
sudo find /var/cache/nginx/proxy -type f -deleteПроверьте владельца каталога:
ls -ld /var/cache/nginx/proxyЕсли владелец отличается от пользователя Nginx, измените его:
sudo chown -R www-data:www-data /var/cache/nginx/proxyЗамените www-data на пользователя, под которым работает Nginx в вашей системе. Узнать его можно командой:
ps aux | grep nginx | grep -v grepОшибка: Кэш не очищается полностью
После удаления файлов место на диске может не освободиться сразу. Nginx держит открытые файловые дескрипторы, но это не мешает удалению: файлы исчезают из каталога, а место освобождается после закрытия дескрипторов. Обычно это происходит мгновенно.
Если место не освобождается, проверьте, не смонтирован ли каталог как tmpfs:
df -h /var/cache/nginx/proxytmpfs хранит данные в оперативной памяти, и удаление файлов освобождает память, а не диск. Это нормальное поведение.
В редких случаях помогает перезапуск Nginx, хотя для очистки кэша он не требуется:
sudo systemctl restart nginxПерезапуск прерывает активные соединения, поэтому выполняйте его только в крайнем случае и в период низкой нагрузки.
Заключение
Очистка кэша Nginx - штатная операция, которая не требует остановки сервера. Алгоритм простой: определите тип кэша, найдите путь в директиве cache_path, удалите файлы командой find или rm, при необходимости настройте cron для регулярной очистки.
Проверяйте результат через заголовок X-Cache-Status и следите за правами доступа. Для контейнерных сред используйте отдельное руководство по очистке кэша в Docker и Kubernetes. Если после очистки возникают ошибки 404 или 502, обратитесь к материалу по диагностике типичных проблем.