Как очистить кеш nginx?
Я использую nginx в качестве фронтального сервера, я изменил файлы CSS, но nginx все еще обслуживает старые.
Я попытался перезапустить nginx, но безуспешно, и у меня есть Google, но я не нашел правильного способа его очистки.
В некоторых статьях говорится, что мы можем просто удалить каталог кеша: var/cache/nginx
, но на моем сервере такой директории нет.
Что мне теперь делать?
25 ответов
У меня была точно такая же проблема - я запускал свой nginx в Virtualbox. У меня не было включено кэширование. Но выглядит как sendfile
был установлен на on
в nginx.conf
и это было причиной проблемы. @kolbyjack упомянул это выше в комментариях.
Когда я выключил sendfile
- это работало нормально.
Sendfile используется для "копирования данных между одним файловым дескриптором и другим" и, очевидно, имеет некоторые реальные проблемы при запуске в среде виртуальной машины или, по крайней мере, при запуске через Virtualbox. Отключение этой конфигурации в nginx приводит к тому, что статический файл обслуживается другим способом, и ваши изменения будут отражены немедленно и без вопросов.
Вы также можете обойти / повторно кэшировать файл за файлом, используя
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"
это вернет свежую копию элемента, а также заменит то, что находится в кеше.
Если вы не сконфигурировали зону кэша через 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 обновил их.
Я запускаю очень простой скрипт 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
У меня тоже была эта проблема.
- Не удалось найти ни одной папки nginx/cache
- sendfile был выключен
Мой домен использует cloudflare.com для DNS (отличный сервис!). Ага! Там это было:
cloudflare.com -> кеширование -> Очистить кэш (я все очистил) Это решило мою проблему!
В этом вопросе два ответа.
- Один для 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 и можете найти каталог с кешем, то вам может подойти то же самое. Будьте очень осторожны с rm -rf
Команда, если вы находитесь не в том каталоге, вы можете удалить весь жесткий диск.
Я нашел это полезным
grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm
Ищите, и если нашли, то удалите.
У нас есть очень большой кэш 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;
}
}
Обратите внимание, что proxy_cache_bypass может причинить вам огромный вред, если ваше приложение не возвращает кэшируемый ответ на этот конкретный запрос, когда вы его запускаете.
Если, например, ваше приложение отправляет куки-файл с каждым первым запросом, то скрипт, который запускает proxy_pass_bypass через curl, вероятно, получит этот куки-файл в ответе, и nginx не будет использовать этот ответ для обновления кэшированного элемента.
Для тех, у кого другие решения не работают, проверьте, используете ли вы службу DNS, такую как CloudFlare. В этом случае активируйте "Режим разработки" или используйте инструмент "Очистить кэш".
На моем сервере папка кеша nginx находится по адресу /data/nginx/cache/
Поэтому я удалил это только: sudo rm -rf /data/nginx/cache/
Надеюсь, это кому-нибудь поможет.
Для тех, кто пытался удалить файлы кеша nginx, и они либо не работали, либо работали с перебоями, взгляните на ваши настройки open_file_cache. Если этот параметр включен и настроен для кэширования дескриптора файла в течение длительного времени, то Nginx может по-прежнему видеть версию кэшированного файла, даже после того, как вы удалили его с диска. Мне пришлось уменьшить open_file_cache_valid до 1 с (я не уверен, что это по сути то же самое, что полное отключение файлового кэша).
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart
Будьте осторожны, чтобы правильно указать правильный путь.
Есть один правильный способ удалить только кеш-файлы, который соответствует любому KEY. Например:
grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf
Это удаляет все кеш-файлы, которые соответствуют KEY "yahoo/*", если в nginx.conf было установлено:
proxy_cache_key $host$uri;
Если вы хотите очистить кеш определенных файлов, вы можете использовать proxy_cache_bypass
директивы. Вот как ты это делаешь
location / {
proxy_cache_bypass $cookie_nocache $arg_nocache;
# ...
}
Теперь, если вы хотите обойти кеш, вы получите доступ к файлу, передав параметр nocache
http://www.example.com/app.css?nocache=true
В моем случае, touch
этот файл Css, чтобы он выглядел так, как будто ресурсы изменены (на самом деле touch
ничего не делает с файлом, кроме времени последнего изменения), поэтому браузер и nginx будут применять последние ресурсы
Вы можете добавить конфигурацию в 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;
....
}
...
}
Сверху в / tmp / динамически создается папка с именем "nginx_cache" для хранения кэшированного содержимого.
Мы используем nginx для кеширования большого количества вещей. В каталоге кеша находятся десятки тысяч элементов. Чтобы найти элементы и удалить их, мы разработали несколько скриптов, упрощающих этот процесс. Вы можете найти репозиторий для этих скриптов ниже:
https://github.com/zafergurel/nginx-cache-cleaner
Идея проста. Чтобы создать индекс кеша (с ключами кеша и соответствующими файлами кеша) и выполнить поиск в этом индексном файле. Это действительно помогло нам ускорить поиск элементов (с минут до долей секунды) и соответственно удалить их.
Что ж, в общих ситуациях проблем с кешем (кэширование браузера, кеширование прокси, кеширование веб-сервера) вы можете использовать общеизвестное решение проблемы с кешем редко изменяющегося содержимого, такого как файлы CSS или JS, - добавляя параметр URI к их ссылкам:
не
<link rel="stylesheet" type="text/css" href="https://example.com/stacks.css">
но
<link rel="stylesheet" type="text/css" href="https://example.com/stacks.css?v=3b16a418cc4c">
Как и Stackru.:)
Я столкнулся с подобной проблемой:
Настройка системы и проблема:(В виртуальной коробке я использую ubuntu и nginx для веб-хостинга - обновления веб-страниц PHP не отражают изменения во внешнем CSS-файле). Я занимаюсь разработкой веб-сайта на машине с Windows и передаю файлы в nginx через общую папку. Кажется, nginx не воспринимает изменения в css-файле (обновление каким-либо образом не помогает. Изменение имени css-файла - единственное, что сработало)
Решение: На ВМ найдите общий файл (в моем случае файл css). Откройте с помощью nano и сравните с файлом в Windows Share (они выглядят одинаково). На ВМ сохраните общий файл с помощью nano. Все изменения теперь отражены в браузере. Не уверен, почему это работает, но в моем случае.
ОБНОВЛЕНИЕ: после перезагрузки сервера VM проблема вернулась. Следуя инструкциям в разделе Решение, CSS снова стал реагировать на обновления.
Этот ответ в основном является резюме:
Expires, Age, Cache-Control are HTTP concepts
Проверьте эти ссылки:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Age
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#caching_static_assets_with_cache_busting
nginx settings
для того же, проверьте ссылку ниже:
Кnot cache
, ниже может помочь: (можно установить меньше времени для повторной проверки кеша раньше):
expires 0;
add_header Cache-Control private;
Кclear cache
:
. Удалить файлы в каталоге кеша (/var/nginx/cache/
)
. Перезагрузите (не перезапустите) nginx-nginx -s reload
См. https://forum.nginx.org/read.php?2,2600,2602 .
Уже есть много ответов, но я думаю, что у меня есть полезное дополнение;
Я запускаю систему Homestead с Hyper-V, и у меня есть проект laravel, работающий на nginx.
У меня не было кеша в моей папке nginx в / etc /
Когда я посещал свой веб-сайт, я получал старые представления сервера и файлы css.
Что решило это для меня после поиска, потраченного впустую, глядя на мою конфигурацию nginx и пробуя вещи, было использование PHP artisan.
Выполните следующую команду в папке, где установлен artisan [корневой каталог проекта laravel]:php artisan optimize:clear
эта команда очищает все кеши, и когда я обновил свою веб-страницу, она наконец обновилась со всеми изменениями.
Надеюсь, это поможет таким заблудшим душам, как я :)
РЕДАКТИРОВАТЬ: Я бы опубликовал это как комментарий к одному из уже существующих ответов, если бы у меня было 50 репутации .. [у меня пока только 43]
В моем случае это был включенный opcache в /etc/php/7.2/fpm/php.ini (Ubuntu):
opcache.enable=1
Установка его на 0 заставила сервер загружать последнюю версию файлов (php).