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

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

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

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

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

18 ответов


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

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

это потому, что:

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


вы также можете обойти / повторно кэшировать файл по файлу с помощью

proxy_cache_bypass $http_secret_header;

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

add_header X-Cache-Status $upstream_cache_status;

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

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

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


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

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

самый простой способ: find /path/to/your/cache -type f -delete


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

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

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


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

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

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

expires modified +90d;

Е. Г.:

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

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

/opt/nginx/cache

и

sudo rm -rf *

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


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

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

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


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


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

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


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

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" me@gmail.com
exit 0

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

будьте осторожны, чтобы правильно указать правильный путь.


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


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

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

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

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


вы можете добавить конфигурацию в 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/ для хранения кэшированного содержимого.


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

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

надеюсь, это поможет кто-нибудь.


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

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

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

proxy_cache_key $host$uri;

Я испытывал своего рода подобный вопрос:

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

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

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


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

В итоге:

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

вот скрипт, адаптированный к 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;
    }
}