Введение: зачем очищать кэш Nginx в контейнерных средах
Кэш Nginx хранит готовые ответы бэкенда, чтобы не гонять каждый запрос к приложению. При обновлении статики, изменении конфигурации или отладке эти сохранённые файлы устаревают. Пользователь получает старую версию страницы, хотя бэкенд уже отдал новую. Если требуется именно полная очистка, содержимое кэш-директории нужно удалить.
В Docker очистка выполняется через docker exec внутри работающего контейнера или через управление volume. В Kubernetes задача решается разовыми Job, проверками ReadinessProbe и Persistent Volumes. ReadinessProbe сама по себе не очищает кэш: она только показывает, может ли под принимать трафик. Цель одна - убрать устаревшие файлы, не уронив сервис. Это руководство даёт готовые команды и манифесты для обеих сред.
Если вы ещё не настраивали кэширование, начните с базовой настройки proxy_cache в Nginx. Для глубокого понимания структуры кэш-директории и параметров proxy_cache_path изучите руководство по очистке и инвалидации кеша Nginx.
Как понять, где именно лежит кэш
Перед удалением определите фактический путь, способ хранения и объект, который подключён к Nginx. Не ориентируйтесь только на каталог /var/cache/nginx: в кастомной конфигурации путь задаётся директивой proxy_cache_path, а данные могут находиться в volume, bind mount или PVC.
Проверка в Docker
Сначала посмотрите путь кэша в активной конфигурации и список подключённых хранилищ:
docker exec <container_name> nginx -T | grep proxy_cache_path
docker inspect <container_name> --format '{{range .Mounts}}{{println .Type .Name .Source .Destination}}{{end}}'В выводе docker inspect поле Destination показывает путь внутри контейнера, а Source - путь на хосте или идентификатор хранилища. Если Source указывает на Docker volume, проверьте его отдельно через docker volume inspect. Для bind mount убедитесь, что на хосте используется именно нужная директория.
Проверка в Kubernetes
В Kubernetes проверьте конфигурацию Nginx, описание Pod и состояние PVC в том же namespace:
kubectl -n <namespace> exec <pod_name> -- nginx -T | grep proxy_cache_path
kubectl -n <namespace> describe pod <pod_name>
kubectl -n <namespace> get pvc nginx-cache-pvcВ секциях Volumes и Mounts из describe должно быть видно, какой PVC подключён и в какой путь он смонтирован. Сверьте эти данные с Job: ошибка в имени PVC или mountPath приведёт к очистке не того хранилища либо к падению Job.
Безопасный чек-лист перед очисткой
- Остановите или ограничьте трафик к очищаемому экземпляру Nginx. Для общего кэша заранее согласуйте окно работ, чтобы запросы не записывали файлы одновременно с удалением.
- Проверьте
proxy_cache_path, фактический путь монтирования, имя volume или PVC и namespace. - Сохраните текущую конфигурацию Nginx перед изменением:
docker exec <container_name> nginx -T > nginx-config-before-cleanup.txt- Проверьте команду на staging-окружении, особенно если используется bind mount, общий PVC или нестандартный пользователь контейнера.
- Убедитесь, что после очистки бэкенд выдержит временный рост cache miss и повторную генерацию ответов.
Очистка кэша Nginx в Docker
Docker-контейнер с Nginx изолирован, но кэш лежит внутри его файловой системы или подключённого хранилища. Доступ к нему возможен двумя путями: выполнение команды внутри контейнера или управление volume. Первый способ быстрый, второй удобен для повторяемой эксплуатации.
Использование docker exec для удаления файлов кэша
Команда docker exec запускает процесс внутри работающего контейнера. Для очистки кэша Nginx используйте оболочку, чтобы символ * раскрылся внутри контейнера:
docker exec <container_name> /bin/sh -c 'rm -rf /var/cache/nginx/*'Вариант без /bin/sh -c может не сработать ожидаемым образом: Docker передаст шаблон /var/cache/nginx/* непосредственно программе rm, не выполнив подстановку содержимого каталога.
Путь /var/cache/nginx часто используется в конфигурациях Nginx, но в кастомных сборках он может отличаться. Перед удалением проверьте каталог:
docker exec <container_name> /bin/sh -c 'ls -la /var/cache/nginx'Если директория пуста или отсутствует, найдите её через конфигурацию Nginx:
docker exec <container_name> nginx -T | grep proxy_cache_pathВывод покажет точный путь, заданный директивой proxy_cache_path. Ошибка в пути при rm -rf опасна: можно удалить не те файлы. Перед выполнением всегда проверяйте содержимое целевой директории и права пользователя, под которым выполняется команда.
Anonymous volume, named volume и bind mount
Способ очистки зависит от типа хранения кэша. Само подключение volume не включает кэширование: путь в хранилище должен совпадать с путём, который использует proxy_cache_path.
Anonymous volume. Docker создаёт volume автоматически, если указать только путь назначения:
docker run -d \
--name nginx-cache-anonymous \
-v /var/cache/nginx \
nginx:latestНайти созданный anonymous volume можно через inspection контейнера:
docker inspect nginx-cache-anonymous --format '{{range .Mounts}}{{println .Name .Source .Destination}}{{end}}'Очищайте его через контейнер, предварительно проверив Destination:
docker exec nginx-cache-anonymous /bin/sh -c 'rm -rf /var/cache/nginx/*'Named volume. Такой вариант удобен, когда кэш нужно сохранять между пересозданиями контейнера и явно подключать к другим процессам.
docker run -d \
--name nginx-cache \
-v nginx-cache-volume:/var/cache/nginx \
nginx:latestОчистить кэш можно через тот же docker exec, но данные физически находятся на volume:
docker exec nginx-cache /bin/sh -c 'rm -rf /var/cache/nginx/*'Второй вариант - удалить содержимое volume с хоста. Сначала найдите точку монтирования:
docker volume inspect nginx-cache-volume --format '{{ .Mountpoint }}'После проверки пути и остановки записи в volume очистите только его содержимое:
MOUNTPOINT=$(docker volume inspect nginx-cache-volume --format '{{ .Mountpoint }}')
sudo rm -rf "$MOUNTPOINT"/*Не используйте docker volume rm, если требуется только очистить кэш: эта команда удаляет сам объект volume и может привести к потере других данных.
Bind mount. Кэш можно хранить в заранее выбранной директории хоста:
mkdir -p ./nginx-cache
docker run -d \
--name nginx-cache-bind \
-v "$PWD/nginx-cache:/var/cache/nginx" \
nginx:latestПосле проверки пути очистите данные непосредственно на хосте:
rm -rf ./nginx-cache/*Для продакшена храните кэш на быстром хранилище, например на SSD-дисках от Timeweb Cloud, чтобы повторное заполнение кэша не создавало узкое место.
Пост-проверка после очистки в Docker
Сразу после удаления проверьте, что в каталоге не осталось файлов кэша:
docker exec <container_name> /bin/sh -c 'find /var/cache/nginx -type f -print'
docker exec <container_name> /bin/sh -c 'ls -la /var/cache/nginx'Пустой вывод find означает, что файлы удалены. Затем выполните запрос к известному cacheable-ресурсу и повторите проверку. После успешного кэширования в каталоге должны появиться новые файлы или подкаталоги. Если этого не произошло, проверьте proxy_cache_path, условия обхода кэша и access log Nginx.
Очистка кэша Nginx в Kubernetes
В Kubernetes поды эфемерны. Кэш, хранящийся внутри контейнера, теряется при рестарте или пересоздании Pod. Для сохранения данных используется Persistent Volume, а для очистки - Job или CronJob. При этом Job не останавливает основной Deployment и не защищает от параллельной записи, поэтому момент запуска нужно согласовать с трафиком и режимом монтирования PVC.
Создание Job для разовой очистки кэша
Job запускает под, который выполняет команду и завершается. Это правильный способ разовой очистки кэша в Kubernetes, если Job подключает тот же PVC и имеет необходимые права:
apiVersion: batch/v1
kind: Job
metadata:
name: nginx-cache-cleaner
spec:
backoffLimit: 1
template:
spec:
containers:
- name: nginx-cache-cleaner
image: nginx:latest
command: ["/bin/sh", "-c", "rm -rf /var/cache/nginx/*"]
volumeMounts:
- name: cache-volume
mountPath: /var/cache/nginx
volumes:
- name: cache-volume
persistentVolumeClaim:
claimName: nginx-cache-pvc
restartPolicy: NeverЕсли основной Pod продолжает обслуживать запросы, он может создать новые файлы во время работы Job. Для полной очистки сначала остановите или выведите из трафика основной экземпляр, а затем запускайте Job. Для PVC с режимом ReadWriteOnce это особенно важно: Job может не подключиться, пока volume используется Pod на другом узле.
Примените манифест и проверьте статус:
kubectl apply -f nginx-cache-cleaner-job.yaml
kubectl get jobs
kubectl logs job/nginx-cache-cleanerJob должен завершиться со статусом Completed. Если под падает с ошибкой, проверьте права доступа к Persistent Volume, корректность пути монтирования и события Pod. В продакшене закрепляйте проверенный тег образа вместо безусловного использования latest. Подробнее об управлении кэшем в Kubernetes читайте в руководстве по кэшированию в Docker и Kubernetes.
Пост-проверка после очистки в Kubernetes
Проверяйте каталог в рабочем Pod Nginx, а не только в Job: именно он должен использовать тот же PVC:
kubectl -n <namespace> exec <pod_name> -- /bin/sh -c 'find /var/cache/nginx -type f -print'
kubectl -n <namespace> get job nginx-cache-cleanerЕсли после Job вывод find пуст, файлы кэша удалены. Выполните запрос к cacheable-ресурсу через Service или Ingress и повторите команду. Новые файлы подтвердят, что Nginx снова записывает кэш. Если каталог остаётся пустым, проверьте фактический proxy_cache_path, обход кэша для этого запроса и соответствие PVC в Deployment и Job.
Настройка ReadinessProbe для проверки состояния сервиса
ReadinessProbe не должна проверять отсутствие произвольного файла cache_file: это не подтверждает, что Nginx принимает запросы, а после следующей очистки условие может вести себя неоднозначно. Заполнение кэша также не является обязательным условием готовности сервиса: cache miss - нормальный результат сразу после очистки.
Для Nginx используйте проверку реально настроенного endpoint состояния:
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3Путь /healthz должен существовать в конфигурации Nginx и возвращать успешный HTTP-статус. Если готовность нужно связать именно с завершением очистки, используйте отдельный маркер, например /var/run/nginx-ready, и создавайте его после очистки в initContainers или другом процессе того же Pod. Probe не сможет увидеть файл в локальной файловой системе другого Pod, созданного Job.
Использование Persistent Volumes для отказоустойчивости
Persistent Volume хранит кэш вне жизненного цикла пода. При пересоздании пода данные сохраняются, и Nginx не начинает с холодного кэша. Это критично для высоконагруженных сервисов, где повторное заполнение кэша создаёт пиковую нагрузку на бэкенд. Если сохранение кэша не требуется, для Pod может быть достаточно временного хранилища, но его содержимое будет потеряно при пересоздании.
Пример PersistentVolumeClaim для одного Pod:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-cache-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10GiReadWriteOnce подходит для сценария, в котором PVC используется одним Pod или одной нодой согласно возможностям конкретного storage class. Если несколько реплик Nginx на разных узлах должны подключать общий PVC, может потребоваться ReadWriteMany, но этот режим доступен не у каждого storage class. Он также не решает автоматически вопросы согласованности общего кэша.
При очистке через Job подключите тот же PVC, что и у основного Deployment. Если используется ReadWriteOnce, запланируйте очистку так, чтобы основной Pod не удерживал volume, либо учитывайте ограничения планировщика и storage class. Убедитесь, что у Job есть права на запись в эту директорию.
Автоматизация очистки кэша с помощью CronJob
Регулярная очистка предотвращает накопление устаревших данных и неконтролируемый рост кэш-директории. CronJob запускает Job по расписанию, но его следует применять только после проверки влияния полного удаления кэша на бэкенд. Пример ежедневной очистки в 03:00:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nginx-cache-cleanup
spec:
schedule: "0 3 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: nginx-cache-cleaner
image: nginx:latest
command: ["/bin/sh", "-c", "rm -rf /var/cache/nginx/*"]
volumeMounts:
- name: cache-volume
mountPath: /var/cache/nginx
volumes:
- name: cache-volume
persistentVolumeClaim:
claimName: nginx-cache-pvc
restartPolicy: NeverПараметр concurrencyPolicy: Forbid запрещает параллельный запуск нескольких Job. Это защищает от наложения очисток, если предыдущая ещё не завершилась. Если PVC имеет режим ReadWriteOnce и основной Pod уже использует volume, CronJob может завершиться с ошибкой монтирования. Выбирайте время с минимальной нагрузкой на сервис и учитывайте запас производительности бэкенда. Для CI/CD-пайплайнов запускайте очистку как отдельный контролируемый шаг, о чём рассказано в FAQ по администрированию динамического контента.
Типовые ошибки при очистке кэша Nginx
Неверный путь к кэшу
Команда отрабатывает без явной ошибки, но старые ответы продолжают выдаваться, если удалён не тот каталог. Сверьте proxy_cache_path через nginx -T и проверьте фактический путь монтирования через docker inspect, describe pod или PVC.
Недостаточно прав
Сообщение Permission denied означает, что пользователь процесса не может удалить файлы. В Docker проверьте пользователя контейнера и права bind mount. В Kubernetes проверьте securityContext, fsGroup и владельца каталога. При необходимости используйте initContainers для подготовки прав, но предварительно проверьте требования политики безопасности кластера.
Volume занят или PVC не монтируется
Состояния Pending, FailedMount и похожие ошибки часто связаны с несовместимым режимом доступа, другим узлом или отсутствующим storage class. Проверьте события:
kubectl -n <namespace> describe pod <pod_name>
kubectl -n <namespace> get events --sort-by=.lastTimestampJob завершается с ошибкой
Проверьте описание Job, Pod, логи и причину завершения контейнера:
kubectl -n <namespace> describe job nginx-cache-cleaner
kubectl -n <namespace> get pods -l job-name=nginx-cache-cleaner
kubectl -n <namespace> logs job/nginx-cache-cleanerНаиболее частые причины - неверный claimName, отсутствующий каталог, недостаточные права и невозможность подключить PVC. Не запускайте повторную очистку вслепую, пока причина не установлена.
Риски и предостережения при очистке кэша
Очистка кэша не проходит бесследно. Сразу после удаления Nginx начинает заново запрашивать данные у бэкенда. Если трафик высокий, бэкенд может получить резкий всплеск нагрузки. Очищайте кэш в непиковые часы или используйте механизм stale-кэша, чтобы Nginx отдавал устаревшие данные, пока бэкенд не ответит.
Если требуется убрать только отдельные устаревшие ответы, полная очистка может быть избыточной. Для таких сценариев используйте точечную инвалидацию, версионирование ресурсов или настройки обхода кэша, описанные в руководстве по инвалидации.
Неправильный путь в команде rm -rf - самая опасная ошибка. Удаление не той директории приводит к потере данных или поломке контейнера. Всегда проверяйте путь через ls или nginx -T. Тестируйте очистку на staging-окружении перед запуском в продакшене.
При использовании Persistent Volumes учитывайте права доступа и конкурентную запись. Job, запущенный под другим пользователем, может не иметь прав на запись в директорию кэша. Настройте securityContext с правильным fsGroup или используйте initContainers для подготовки прав.
FAQ: очистка кэша Nginx в Docker и Kubernetes
Как удалить кэш Nginx без перезапуска контейнера?
В Docker используйте docker exec с /bin/sh -c и командой rm -rf /var/cache/nginx/*. В Kubernetes применяйте Job с тем же PVC или выполняйте команду в рабочем Pod после проверки пути и влияния на трафик.
Почему команда rm -rf не удаляет файлы?
В Docker символ * должен раскрываться внутри контейнера, поэтому используйте /bin/sh -c. Также проверьте, что путь соответствует proxy_cache_path, а пользователь имеет права на удаление.
Можно ли удалить Docker volume целиком?
Технически это возможно, если volume не используется, но команда docker volume rm удаляет сам объект хранения. Для обычной очистки кэша безопаснее удалить содержимое нужного каталога и сохранить volume.
Можно ли чистить PVC через CronJob?
Да, если storage class поддерживает нужный режим доступа, Job может подключить PVC, а расписание не конфликтует с основным Pod. Для ReadWriteOnce заранее учитывайте, что volume может быть занят Pod на другой ноде.
Заключение
В Docker очистка кэша Nginx выполняется через docker exec с командой rm -rf или через управление volume, смонтированным в директорию кэша. Учитывайте различия между anonymous volume, named volume и bind mount. В Kubernetes используйте Job для разовой очистки, CronJob для регулярной, ReadinessProbe для контроля состояния сервиса и Persistent Volumes для сохранности данных. Выбор метода зависит от того, насколько часто нужно очищать кэш и какие требования к отказоустойчивости предъявляет сервис.
Проверяйте пути перед удалением, тестируйте на staging, учитывайте режим доступа PVC и выполняйте пост-проверку после очистки. Эти меры минимизируют риски и сохраняют стабильность сервиса. Для углублённого изучения инвалидации кэша и стратегий разгрузки бэкенда обратитесь к руководству по инверсному кэшированию.