Как очистить кеш 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), а затем удаляет каталог кеша, не останавливая основное приложение для дискового ввода-вывода.

В итоге:

  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;
    }
}

Обратите внимание, что 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
Проверьте эти ссылки:

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).

Другие вопросы по тегам