Как очистить кеш nginx?

Я использую nginx в качестве переднего сервера, я изменил файлы CSS, но nginx все еще обслуживает старые.

Я попытался перезапустить nginx, не добившись успеха, и у меня есть Googled, но не найден допустимый способ его очистки.

В некоторых статьях мы можем просто удалить каталог кэша: var/cache/nginx, но на моем сервере нет такой директории.

Что мне теперь делать?

Ответ 1

У меня была точно такая же проблема - я запускал свой nginx в Virtualbox. У меня не было включено кэширование. Но похоже, что sendfile был установлен на on в nginx.conf, и это вызывало проблему. @kolbyjack упомянул это выше в комментариях.

Когда я выключил sendfile - все работало нормально.

Это потому что:

Sendfile используется для "копирования данных между одним дескриптором файла и другим" и, по-видимому, имеет некоторые реальные проблемы при запуске в среде виртуальной машины или, по крайней мере, при запуске через Virtualbox. Отключение этой конфигурации в nginx приводит к тому, что статический файл обслуживается другим способом, и ваши изменения будут отражены немедленно и без вопросов

Это связано с этой ошибкой: https://www.virtualbox.org/ticket/12597

Ответ 2

Вы также можете обходить/повторно кэшировать файл по файлу, используя

proxy_cache_bypass $http_secret_header;

и в качестве бонуса вы можете вернуть этот заголовок, чтобы узнать, достали ли вы его из кеша (вернете "HIT" ) или с сервера содержимого (вернете "BYPASS" ).

add_header X-Cache-Status $upstream_cache_status;

для истечения/обновления кэшированного файла, используйте curl или любой клиент для отдыха, чтобы сделать запрос на кэшированную страницу.

curl http://abcdomain.com/mypage.html -s -I -H "secret-header:true"

это вернет новую копию элемента, а также заменит то, что в кеше.

Ответ 3

Если вы не настроили зону кеша через proxy_cache_path, а затем использовали ее (например, в блоке местоположения) с помощью: proxy_cache ничего не будет кэшировано.

Если вы это сделали, то в соответствии с автором nginx достаточно просто удалить все файлы из каталога кеша.

Простейший способ: find /path/to/your/cache -type f -delete

Ответ 4

Вы можете удалить каталог кеширования nginx или выполнить поиск определенного файла:

grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*

И удалите только один файл, чтобы обновить nginx.

Ответ 5

В этом вопросе есть два ответа.

  • Один для nginx как обратный кэш
  • Другой для очистки кеша браузера с помощью ввода заголовка (этот)

Использование:

expires modified +90d;

E.G.:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}

Ответ 6

В моей установке nginx я обнаружил, что мне нужно перейти к:

/opt/nginx/cache

и

sudo rm -rf *

в этом каталоге. Если вы знаете путь к установке nginx и можете найти каталог кеша, то то же самое может сработать для вас. Будьте очень осторожны с помощью команды rm -rf, если вы находитесь в неправильном каталоге, вы можете удалить весь жесткий диск.

Ответ 7

Я нашел это полезным

grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm

Поиск, а если он найден, удалите.

Ответ 8

У меня тоже была эта проблема.

  • Не удалось найти какую-либо папку nginx/cache
  • sendfile отключен

Мой домен использует cloudflare.com для DNS (отличный сервис!). Ага! Там было:

cloudflare.com → кеширование → Очистить кеш (я очистил все) Это решило мою проблему!

Ответ 9

Я запускаю очень простой bash script, который занимает все 10 секунд, чтобы выполнить задание, и отправляет мне почту по завершении.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" [email protected]
exit 0

Ответ 10

У нас очень большой кеш nginx (гигабайт), который нам иногда нужно стереть. Я разработал script, который мгновенно очищает кеш (насколько это касается Nginx), а затем удаляет каталог кеша без голодания основного приложения для ввода/вывода диска.

Вкратце:

  • Переместите папку кэша в новое место (в одной и той же файловой системе!) (это не разрушает дескрипторы открытых файлов)
  • Восстановить исходную папку кэша, пуст
  • Перезагрузите Nginx (изящная перезагрузка, где nginx позволяет старым работникам заканчивать запросы на выполнение)
  • Удалить старые кэшированные данные

Здесь script, с учетом Ubuntu 16.04 LTS, с кешем, расположенным в /mnt/nginx-cache:

#!/bin/bash
set -e

TMPCACHE=`mktemp --directory --tmpdir=/mnt nginx-cache-XXXXXXXXXX`
TMPTEMP=`mktemp --directory --tmpdir=/mnt nginx-temp-XXXXXXXXXX`

# Move the old cache folders out of the way
mv /mnt/nginx-cache $TMPCACHE
mkdir -p /mnt/nginx-cache
chmod -R 775 /mnt/nginx-cache
chown www-data:www-data /mnt/nginx-cache

mv /mnt/nginx-temp $TMPTEMP
mkdir -p /mnt/nginx-temp
chmod -R 775 /mnt/nginx-temp
chown www-data:www-data /mnt/nginx-temp

# Tell Nginx about the new folders.
service nginx reload

# Create an empty folder.
rm -rf /mnt/empty
mkdir -p /mnt/empty

# Remove the old cache and old temp folders w/o thrashing the disk...
# See http://serverfault.com/questions/546177/how-to-keep-subtree-removal-rm-rf-from-starving-other-processes-for-disk-i
# Note: the `ionice` and `nice` may not actually do much, but why not?
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPCACHE
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPTEMP
rm -rf $TMPCACHE
rm -rf $TMPTEMP

rm -rf /mnt/empty

И в случае, если это полезно, здесь используется конфигурация Nginx:

upstream myapp {
    server localhost:1337 fail_timeout=0;
}

proxy_cache_path /mnt/nginx-cache/app levels=2:2:2 keys_zone=app_cache:100m inactive=1y max_size=10g;
proxy_temp_path  /mnt/nginx-temp/app;

server {
    listen   4316 default;
    server_name  myapp.com;

    location / {
        proxy_pass http://appserv;
        proxy_cache app_cache;
        proxy_cache_valid 200 1y;
        proxy_cache_valid 404 1m;
    }
}

Ответ 11

Для тех, у кого другие решения не работают, проверьте, используете ли вы службу DNS, такую как CloudFlare. В этом случае активируйте "Режим разработки" или используйте инструмент "Очистить кэш".

Ответ 12

Обратите внимание, что proxy_cache_bypass может дать вам мир обид, если ваше приложение не вернет кэш-ответ для этого конкретного запроса, где вы его вызываете.

Если, например, ваше приложение отправляет cookie с каждым первым запросом, то script, который запускает proxy_pass_bypass через curl, вероятно, получит этот файл cookie в ответе, а nginx не будет использовать этот ответ для обновления кэшированного элемента.

Ответ 13

find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

Соблюдайте правильную настройку правильного пути.

Ответ 14

Для тех, кто пытался удалить файлы кеша nginx, и либо он не работал, либо работал с перерывами, посмотрите на свой параметр для open_file_cache. Если это включено и настроено для кэширования файлового дескриптора в течение длительного времени, Nginx все еще может видеть версию кэшированного файла даже после того, как вы удалили его с диска. Мне пришлось уменьшить open_file_cache_valid до 1s (я не уверен, что это по сути то же самое, что полностью отключить кеш файл).

Ответ 15

Если вы хотите очистить кеш определенных файлов, вы можете использовать директиву proxy_cache_bypass. Вот как ты это делаешь

location / {
    proxy_cache_bypass $cookie_nocache $arg_nocache;
    # ...
}

Теперь, если вы хотите обойти кеш, вы получите доступ к файлу, передав параметр nocache

http://www.example.com/app.css?nocache=true

Ответ 16

На моем сервере папка кеша nginx находится в /data/nginx/cache/

Поэтому я удалил его только: sudo rm -rf /data/nginx/cache/

Надеюсь, это поможет любому.

Ответ 17

Вы можете добавить конфигурацию в nginx.conf, как показано ниже.

...
http {
proxy_cache_path  /tmp/nginx_cache levels=1:2 keys_zone=my-test-cache:8m max_size=5000m inactive=300m;

server {
    proxy_set_header X- Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_cache my-test-cache;
    proxy_cache_valid  200 302  1m;
    proxy_cache_valid  404      60m;
    proxy_cache_use_stale   error timeout invalid_header updating;
    proxy_redirect off;

    ....
}
...
}

Сверху динамически создается папка с именем "nginx_cache" в/tmp/для хранения кэшированного содержимого.

Ответ 18

Существует один правильный метод удаления только кеш файлов, который соответствует любому KEY. Например:

grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf

Это удаляет все файлы кэша, которые соответствуют KEY "yahoo/*", если в nginx.conf установлен:

proxy_cache_key $host$uri;

Ответ 19

У меня возникла подобная проблема:

Настройка системы и проблема: (На виртуальном ящике я занимаюсь веб-хостингом с помощью ubuntu и nginx - обновления веб-страницы PHP не отражают изменений внешнего файла css). Я разрабатываю веб-сайт на машине Windows и передаю файлы в nginx через общую папку. Кажется, nginx не подбирает изменения в css файле (обновление в любом режиме не помогает. Изменение имени файла css - это только то, что сработало)

Решение: В VM найдите общий файл (файл css в моем случае). Открыть с nano и сравнить с файлом в share Windows (они кажутся идентичными). На виртуальной машине сохранить общий файл с помощью nano. Все изменения теперь отображаются в браузере. Не уверен, почему это работает, но это произошло в моем случае.

UPDATE: после перезагрузки сервера VM проблема вернулась. Следуя инструкциям в разделе "Решение", css снова реагирует на обновления.

Ответ 20

В моем случае это был включенный opcache в /etc/php/7.2/fpm/php.ini(Ubuntu):

opcache.enable=1

При установке значения 0 сервер загружал последнюю версию (php) файлов.

Ответ 21

Мы используем nginx для кеширования множества вещей. В каталоге кеша находятся десятки тысяч элементов. Чтобы найти элементы и удалить их, мы разработали несколько скриптов для упрощения этого процесса. Вы можете найти репозиторий для этих скриптов ниже:

https://github.com/zafergurel/nginx-cache-cleaner

Идея проста. Создать индекс кэша (с ключами кэша и соответствующими файлами кэша) и выполнить поиск в этом файле индекса. Это действительно помогло нам ускорить поиск элементов (с минут до секунды) и соответственно удалить их.