Когда нужна ручная очистка кэша Nginx
Ручная очистка кэша Nginx на уровне файловой системы требуется в трех случаях. Первый: модуль ngx_cache_purge не установлен, а коммерческий nginx-plus недоступен, при этом нужно точечно или полностью сбросить закэшированные данные. Второй: кэш разросся до критического размера и занимает весь раздел диска, из-за чего Nginx не может записывать новые файлы. Третий: стандартные механизмы инвалидации вышли из строя, например, после сбоя конфигурации или повреждения зоны разделяемой памяти.
Ручное удаление файлов кэша - это крайняя мера. Она не требует дополнительных модулей и работает в любой сборке Nginx, но несет риски: можно удалить файлы, которые используются активными соединениями, или нарушить целостность каталога. Поэтому перед очисткой выполняйте полный анализ структуры и делайте резервную копию, если объем позволяет.
Если вам нужны альтернативные способы сброса кэша, изучите полное руководство по очистке и инвалидации кеша Nginx. Там разобраны три рабочих метода, включая proxy_cache_bypass и автоматизацию в CI/CD.
Определяем расположение кэша Nginx
Путь к каталогу кэша задается директивой proxy_cache_path в конфигурации Nginx. Найдите её командой:
grep -r proxy_cache_path /etc/nginx/Пример вывода:
/etc/nginx/conf.d/cache.conf:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;Из этой строки видно: кэш хранится в /var/cache/nginx, имена подкаталогов формируются по схеме levels=1:2 (один символ первого уровня, два символа второго), зона памяти называется my_cache, максимальный размер - 10 ГБ, неактивные файлы хранятся 60 минут. Если grep не дал результата, проверьте полную конфигурацию через nginx -T:
nginx -T | grep proxy_cache_pathЭта команда выводит объединенную конфигурацию со всеми подключенными файлами, включая те, что находятся вне /etc/nginx/.
Структура каталога кэша
Каталог кэша Nginx имеет иерархическую структуру. При levels=1:2 внутри корневого каталога создаются подкаталоги с именами из одного символа (цифры или буквы от a до f), внутри них - подкаталоги из двух символов. Файлы кэша лежат на третьем уровне и имеют хэшированные имена без расширений. Посмотрите на структуру:
ls -la /var/cache/nginx/Вывод покажет множество каталогов вида 0/, 1/, a/, b/ и так далее. Внутри каждого - подкаталоги вида 00/, 1f/, a3/. Файлы внутри не имеют расширений и содержат как сами данные ответа, так и метаданные: заголовки, ключ кэша, время создания. Удалять отдельные файлы по именам бессмысленно, так как имена - это MD5-хэши от ключей кэша, и сопоставить их с URL без дополнительных инструментов сложно.
Поиск файлов кэша для удаления
Перед удалением проведите анализ: оцените общий объем кэша, найдите самые большие файлы и определите возраст данных. Это поможет решить, что удалять в первую очередь. Начните с оценки размера подкаталогов:
du -sh /var/cache/nginx/*Команда покажет размер каждого подкаталога первого уровня. Если какой-то подкаталог занимает непропорционально много места, углубитесь в него. Для поиска самых больших файлов используйте сортировку:
du -ah /var/cache/nginx | sort -rh | head -20Вывод покажет 20 самых объемных файлов с их путями. Это кандидаты на удаление, если нужно быстро освободить место. Для поиска по возрасту используйте find. Файлы старше 30 дней:
find /var/cache/nginx -type f -mtime +30 -lsОпция -mtime +30 означает «изменен более 30 дней назад». Опция -ls выводит список с деталями: права, владелец, размер, дата изменения. Не добавляйте -delete сразу - сначала посмотрите, сколько файлов попадает под условие и какие у них размеры.
Использование find для фильтрации по возрасту и размеру
Команда find - основной инструмент для отбора файлов кэша. Основные опции:
-mtime +N- файлы, измененные более N дней назад-mtime -N- файлы, измененные менее N дней назад-atime +N- файлы, к которым не обращались более N дней-ctime +N- файлы, у которых метаданные не менялись более N дней-size +10M- файлы больше 10 МБ-size -1M- файлы меньше 1 МБ
Комбинируйте условия через -a (логическое И) или -o (логическое ИЛИ). Например, найти файлы старше 30 дней и больше 5 МБ:
find /var/cache/nginx -type f -mtime +30 -a -size +5M -lsДля подсчета количества найденных файлов замените -ls на wc -l:
find /var/cache/nginx -type f -mtime +30 | wc -lЭто даст понимание масштаба перед удалением. Если файлов тысячи, удаление займет время и создаст нагрузку на диск.
Оценка занимаемого места с помощью du
Команда du показывает фактический размер на диске, а не логический размер файлов. Для кэша Nginx это важно, так как файлы могут быть фрагментированы. Базовые варианты:
du -sh /var/cache/nginxПоказывает общий размер каталога в человекочитаемом формате. Для детализации по подкаталогам второго уровня:
du -h --max-depth=2 /var/cache/nginx | sort -rh | head -30Эта команда выведет 30 самых больших путей с глубиной до двух уровней. Если вы видите, что один подкаталог занимает 80% всего кэша, а остальные - по 1-2%, это сигнал о неравномерном распределении, которое может быть вызвано особенностями ключей кэширования.
Безопасное удаление файлов кэша
Удаление файлов кэша - необратимая операция. Nginx не хранит индекс файлов в оперативной памяти, поэтому после удаления он просто создаст новые файлы при следующих запросах. Но есть нюансы: если удалить файл, который в данный момент читается для ответа клиенту, запрос может оборваться. Если удалить каталоги, Nginx может не суметь создать новые файлы из-за отсутствия родительской структуры.
Предосторожности перед удалением
Перед удалением выполните следующие шаги. Первый: переведите Nginx в режим обслуживания или остановите его, если простой допустим. Команда остановки:
systemctl stop nginxЕсли остановка невозможна, хотя бы убедитесь, что нет активных длинных запросов. Второй шаг: создайте резервную копию каталога кэша, если объем позволяет. Команда:
tar -czf /backup/nginx-cache-$(date +%Y%m%d).tar.gz /var/cache/nginxТретий шаг: проверьте права доступа и владельца каталога кэша до удаления, чтобы восстановить их после:
ls -ld /var/cache/nginxЗапишите вывод. После очистки права должны остаться такими же, иначе Nginx не сможет писать в кэш.
Примеры команд удаления
Удаление файлов старше 30 дней:
find /var/cache/nginx -type f -mtime +30 -deleteУдаление файлов больше 10 МБ:
find /var/cache/nginx -type f -size +10M -deleteКомбинированное удаление: файлы старше 14 дней И больше 5 МБ:
find /var/cache/nginx -type f -mtime +14 -a -size +5M -deleteПолная очистка каталога кэша с сохранением структуры подкаталогов:
find /var/cache/nginx -type f -deleteЭта команда удаляет все файлы, но оставляет каталоги. Nginx сможет продолжать писать в них без пересоздания структуры. Если нужно удалить и пустые подкаталоги, добавьте -empty -delete после удаления файлов:
find /var/cache/nginx -type f -delete && find /var/cache/nginx -depth -type d -empty -deleteБудьте осторожны с этой командой: она удалит и корневой каталог, если он окажется пустым. После полной очистки пересоздайте каталог вручную, если он был удален:
mkdir -p /var/cache/nginx && chown nginx:nginx /var/cache/nginxЗамените nginx:nginx на фактического пользователя и группу из вашей конфигурации.
Проверка целостности и работы Nginx после очистки
После удаления файлов проверьте, что Nginx запускается и корректно обрабатывает запросы. Начните с проверки синтаксиса конфигурации:
nginx -tОжидаемый вывод:
nginx: configuration file /etc/nginx/nginx.conf test is successfulЕсли есть ошибки, исправьте их до перезапуска. Затем перезагрузите Nginx. Перезагрузка безопаснее полного перезапуска: она не обрывает активные соединения:
systemctl reload nginxИли:
nginx -s reloadПосле перезагрузки проверьте, что Nginx создает новые файлы кэша. Сделайте тестовый запрос к закэшированному ресурсу:
curl -I https://example.com/cached-pageЗатем проверьте, появились ли новые файлы в каталоге кэша:
find /var/cache/nginx -type f -mmin -5 | head -10Если команда выводит файлы, кэш работает. Если нет - проверьте права доступа и владельца каталога.
Проверка конфигурации и перезапуск
Проверка nginx -t обязательна перед любым перезапуском, но при ручной очистке кэша она особенно важна: вы могли случайно удалить не только файлы кэша, но и что-то из конфигурации, если каталоги пересекаются. После nginx -t выполните перезагрузку, а не перезапуск. Перезагрузка отправляет мастер-процессу сигнал на перечитывание конфигурации и плавно переключает рабочие процессы. Полный перезапуск через systemctl restart nginx обрывает все соединения и нужен только при серьезных изменениях.
Мониторинг после очистки
В течение часа после очистки следите за размером каталога кэша:
watch -n 60 'du -sh /var/cache/nginx'Команда обновляет размер каждые 60 секунд. Если кэш растет слишком быстро, возможно, вы удалили файлы, которые активно запрашиваются, и Nginx массово пересоздает их. Это нормально, но создает нагрузку на бэкенд. Проверьте логи на ошибки:
tail -f /var/log/nginx/error.logИщите сообщения о правах доступа, невозможности создать файл или ошибках записи. Если ошибок нет, а новые файлы появляются, очистка прошла успешно.
Если после очистки вы столкнулись с ошибками 404, 502 или устаревшим контентом, обратитесь к руководству по диагностике и устранению типичных ошибок очистки кэша Nginx. Там разобраны Permission denied, некорректные пути и другие частые проблемы.
Автоматизация ручной очистки кэша
Ручная очистка - разовая мера. Если кэш регулярно разрастается, настройте автоматическую очистку через cron. Это снизит риск ручных ошибок и обеспечит предсказуемое состояние диска. Базовый скрипт для удаления файлов старше 30 дней с логированием:
#!/bin/bash
CACHE_DIR="/var/cache/nginx"
LOG_FILE="/var/log/nginx-cache-clean.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') Начало очистки" >> "$LOG_FILE"
find "$CACHE_DIR" -type f -mtime +30 -delete -print >> "$LOG_FILE" 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') Очистка завершена" >> "$LOG_FILE"Сохраните скрипт как /usr/local/bin/nginx-cache-clean.sh и сделайте исполняемым:
chmod +x /usr/local/bin/nginx-cache-clean.shПример скрипта для очистки
Скрипт выше удаляет файлы старше 30 дней и записывает каждый удаленный файл в лог. Опция -print выводит путь к файлу, -delete удаляет его. Перенаправление >> "$LOG_FILE" 2>&1 записывает и стандартный вывод, и ошибки. Для более агрессивной очистки по размеру добавьте вторую команду:
find "$CACHE_DIR" -type f -size +50M -delete -print >> "$LOG_FILE" 2>&1Эта строка удалит файлы больше 50 МБ независимо от возраста. Используйте её, если в кэше появляются аномально большие объекты.
Настройка cron
Запланируйте ежедневный запуск скрипта в непиковое время, например, в 3:30 ночи:
crontab -eДобавьте строку:
30 3 * * * /usr/local/bin/nginx-cache-clean.shУчитывайте нагрузку на диск: если кэш большой, удаление тысяч файлов может занять несколько минут и замедлить работу Nginx. В этом случае запускайте скрипт реже или используйте ionice для снижения приоритета ввода-вывода:
30 3 * * * ionice -c 3 /usr/local/bin/nginx-cache-clean.shКласс -c 3 означает idle - скрипт будет работать только когда диск свободен. Перед внедрением в production протестируйте скрипт на тестовом сервере с копией каталога кэша.
Если вы работаете с Nginx в контейнерных средах, изучите руководство по очистке кэша Nginx в Docker и Kubernetes. Там есть готовые Job-манифесты и команды docker exec для безопасной работы с volume.
Для настройки самого кэширования, включая TTL, мониторинг хитрейта и безопасность, используйте полное руководство по настройке кэширования Nginx. Оно поможет выстроить стратегию так, чтобы ручная очистка требовалась как можно реже.