Как очистить кэш 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), а затем удаляет каталог кэша, не голодая основное приложение для ввода-вывода диска
В итоге:
- переместить папку кэша в новое место (в той же файловой системе!) (это не нарушает никаких открытых файловых дескрипторов)
- воссоздать исходную папку кэша , пусто
- Перезагрузить Nginx (изящный Перезагрузка, где nginx позволяет старым рабочим заканчивать незавершенные запросы)
- удалить старые кэшированные данные
вот скрипт, адаптированный к 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;
}
}