Ручная очистка кэша Nginx: поиск и удаление файлов на диске через командную строку | AdminWiki

Ручная очистка кэша Nginx: поиск и удаление файлов на диске через командную строку

20 августа 2026 8 мин. чтения

Когда нужна ручная очистка кэша 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. Оно поможет выстроить стратегию так, чтобы ручная очистка требовалась как можно реже.

Поделиться:
Сохранить гайд? В закладки браузера