Wie lösche ich den Cache von Nginx?

250

Ich benutze nginx als Frontserver, ich habe die CSS-Dateien geändert, aber nginx bedient immer noch die alten.

Ich habe versucht, nginx neu zu starten, ohne Erfolg, und ich habe gegoogelt, aber keinen gültigen Weg gefunden, dies zu löschen.

Einige Artikel sagen, wir können nur das Cache-Verzeichnis löschen: var/cache/nginxaber es gibt kein solches Verzeichnis auf meinem Server.

Was sollte ich jetzt tun?

Freilauf
quelle
1
Weitere Details zu Ihrer Nginx-Konfiguration wären sehr hilfreich. Sind Sie mit proxy_cache?
Alexander Azarov
Nein, ich habe gerade die Standardkonfiguration verwendet und nach Zeichenfolge gesucht cacheund sie nicht in den Konfigurationsdateien gefunden
Freewind
5
Nginx wird standardmäßig nicht zwischengespeichert.
Alexander Azarov
30
Laufen Sie in einer Virtualbox / Vargant VM? Wenn ja, deaktivieren Sie sendfile, da sie nicht gut zusammenspielen.
Kolbyjack
5
Sind Sie sicher, dass sich das Caching auf der Nginx-Seite befindet? Haben Sie das Verhalten mit einem Werkzeug wie Curl überprüft? Oft ist ein Problem wie dieses nur das clientseitige Caching, bei dem keine aktualisierte Ressource angefordert wird, da mitgeteilt wurde, dass die alte Ressource bis zum Ablauf von max. oder etwas ähnliches.
Kolbyjack

Antworten:

185

Ich hatte genau das gleiche Problem - ich habe meinen Nginx in Virtualbox ausgeführt. Ich hatte kein Caching aktiviert. Aber sieht aus wie sendfilewurde auf onin nginx.confund, die das Problem verursacht wurde. @kolbyjack hat es oben in den Kommentaren erwähnt.

Als ich abschaltete sendfile, funktionierte es gut.

Das ist weil:

Sendfile wird verwendet, um Daten zwischen einem Dateideskriptor und einem anderen zu kopieren, und hat anscheinend einige echte Probleme, wenn es in einer Umgebung einer virtuellen Maschine oder zumindest über Virtualbox ausgeführt wird. Wenn Sie diese Konfiguration in nginx deaktivieren, wird die statische Datei über eine andere Methode bereitgestellt, und Ihre Änderungen werden sofort und ohne Frage übernommen

Es hängt mit diesem Fehler zusammen: https://www.virtualbox.org/ticket/12597

Deepan Chakravarthy
quelle
7
Siehe diesen Link
Sian Lerk Lau
In meinem Fall besteht die alternative Problemumgehung darin, gzip für diese Dateitypen zu aktivieren. In jedem Fall ist das Problem gelöst.
Dingle
Vielen Dank und Kolbyjack für die Antwort. Hat mein Leben gerettet.
T1000
1
Ich habe 'sudo vim /etc/nginx/nginx.conf' verwendet und 'sendfile on' in 'sendfile off' geändert
Koray Güclü
12
Ich habe sendfile ausgeschaltet. Kein Glück.
Marukobotto
110

Sie können den Code auch Datei für Datei umgehen / neu zwischenspeichern

proxy_cache_bypass $http_secret_header;

Als Bonus können Sie diesen Header zurückgeben, um zu sehen, ob Sie ihn aus dem Cache (wird 'HIT' zurückgeben) oder vom Inhaltsserver (wird 'BYPASS' zurückgeben) erhalten haben.

add_header X-Cache-Status $upstream_cache_status;

Verwenden Sie zum Ablaufen / Aktualisieren der zwischengespeicherten Datei curl oder einen anderen Restclient, um eine Anforderung an die zwischengespeicherte Seite zu senden.

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

Dadurch wird eine neue Kopie des Elements zurückgegeben und das, was sich im Cache befindet, ersetzt.

Jason Wiener
quelle
7
Warum kann ich dies nur einmal positiv bewerten? Ich möchte eine Unmenge machen :)
Spock
2
Dies kann zwischengespeicherte Seiten nur aktualisieren, wenn die neue Seite ebenfalls zwischengespeichert werden kann. Wenn Sie eine Seite entfernt haben (404 oder andere Fehler werden jetzt vom Backend bereitgestellt), sendet die Seite jetzt ein Set-Cookie oder einen "Content-Control: Private" -Header. Der zwischengespeicherte Inhalt wird nicht "ungültig".
Rbu
3
Dieser "add_header X-Cache-Status $ upstream_cache_status;" ist so ein cooles Feature!
Maxim Masiutin
1
Vielen Dank. netter Tipp für die Ungültigmachung des Caches, es gibt so wenig Tutorials über
Nginx
4
Hat sich dies geändert, seit du gepostet hast? Ich kann erfolgreich eine neue Kopie mit dem "geheimen Header" erhalten, aber sobald ich den Header entferne, erhalte ich wieder die zwischengespeicherte Version ...
Pluc
60

Sofern Sie keine Cache-Zone über proxy_cache_path konfiguriert und dann verwendet haben (z. B. in einem Standortblock), wird über: proxy_cache nichts zwischengespeichert.

Wenn Sie dies jedoch getan haben, reicht es laut dem Autor von nginx aus , einfach alle Dateien aus dem Cache-Verzeichnis zu entfernen.

Einfachster Weg: find /path/to/your/cache -type f -delete

Gnarfoz
quelle
Ich erhalte dies in meinem Fehlerprotokoll nach dem Löschen der Dateien:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson
Wiederholt oder nur einmal? Es sollte kein wirkliches Problem sein. Dies bedeutet wahrscheinlich nur, dass der Cache-Manager versucht hat, eine bereits gelöschte Datei zu löschen. Vielleicht hilft das Neuladen von nginx (nginx -s reload), wenn Sie die Nachricht wiederholt erhalten. (Nicht sicher, ob dies auch den Cache-Manager neu
initialisiert
1
Ja, ich lösche den Cache für meine Website automatisch durch ein Skript, wenn ich eine Änderung bereitstelle, und das Neuladen von nginx behebt sie auch nicht.
Collin Anderson
Nop Nginx speichert etwas zwischen, auch wenn Sie kein Proxy-Material verwenden, aber es ist ein Fehler mit Nginx + VirtualBox.
Thomas Decaux
1
Das klingt ziemlich vage. Könnten Sie das näher erläutern? Scheint nicht mit dem hier behandelten Thema zu tun zu haben.
Gnarfoz
20

Sie können das Cache-Verzeichnis von nginx löschen oder eine bestimmte Datei durchsuchen:

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

Und löschen Sie nur eine Datei, um sie durch Nginx zu aktualisieren.

Łukasz Sokolik
quelle
1
Um den genauen Treffer zu erhalten, können Sie $ an den Suchbegriff anhängen . Gefällt grep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
mir
1
Leider habe ich die folgende Ausgabe bekommen grep: /var/nginx/cache/*: No such file or directoryIch verwende Ubuntu 14.04.3 LTS und nginx / 1.8.1. Irgendeine Idee?
b00r00x0
Versuchen Sie Folgendes, um Dateien unter / var / nginx / cache zu sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
durchsuchen
Ich glaube, es ist / var / cache / nginx / * (dir Cache vor nginx im Pfad)
Randy Lam
15

Diese Frage enthält zwei Antworten.

  • Eine für Nginx als Reverse Cache
  • Eine andere zum Bereinigen des Browser-Cache durch Header-Eingabe (diese hier)

Verwenden:

expires modified +90d;

Z.B:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
Deyes
quelle
Ich habe diese Implementierung ausprobiert, weil ich ein ähnliches Problem habe. Nachdem ich die Änderung vorgenommen habe, wird die Standard-Nginx-Seite angezeigt. Ich verwende Niginx als LB mit Proxy. Muss ich vielleicht root wechseln?
Aaron
10

Ich fand das nützlich

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

Suchen und wenn gefunden, dann löschen.

agustik
quelle
9

Bei meiner Nginx-Installation musste ich gehen zu:

/opt/nginx/cache

und

sudo rm -rf *

in diesem Verzeichnis. Wenn Sie den Pfad zu Ihrer Nginx-Installation kennen und das Cache-Verzeichnis finden, funktioniert dies möglicherweise auch für Sie. Seien Sie sehr vorsichtig mit dem rm -rfBefehl. Wenn Sie sich im falschen Verzeichnis befinden, können Sie Ihre gesamte Festplatte löschen.

Ganesh Shankar
quelle
2
Danach
Und das ist der schlechte Teil
Kidz
9

Ich führe ein sehr einfaches Bash-Skript aus, das alle 10 Sekunden benötigt, um den Job zu erledigen, und sende mir eine E-Mail, wenn ich fertig bin.

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

Ich hatte auch dieses Problem.

  • Es konnte kein Nginx / Cache-Ordner gefunden werden
  • sendfile war aus

Meine Domain verwendet cloudflare.com für DNS (großartiger Service!). Aha! Da war es:

cloudflare.com -> Caching -> Cache löschen (ich habe alles gelöscht ) Das hat mein Problem gelöst!

Asle
quelle
2
Dadurch werden die Edge-Caches von Cloudflare gelöscht. Der Nginx-Cache auf Ihrem eigenen Server wird nicht gelöscht.
Mahemoff
Als Rat halte ich eine gültige Antwort.
Fernando Kosh
Dies war eine ausgezeichnete Antwort. Ich habe stundenlang nachgeforscht, warum einige Dateien immer noch zwischengespeichert werden, und konnte nicht vermuten, dass es sich um einen CloudFlare-Fehler handelte. Vielen Dank!
Undefinedman
6

Wir haben einen sehr großen Nginx-Cache (Gigabyte), den wir gelegentlich löschen müssen. Ich habe ein Skript ausgearbeitet, das den Cache sofort löscht (soweit es Nginx betrifft) und dann das Cache-Verzeichnis entfernt, ohne die Hauptanwendung für Festplatten-E / A zu beeinträchtigen.

Zusammenfassend:

  1. Verschieben Sie den Cache-Ordner an einen neuen Speicherort (im selben Dateisystem!) (Dies stört keine offenen Dateideskriptoren)
  2. Erstellen Sie den ursprünglichen Cache-Ordner neu, leer
  3. Nginx neu laden ( elegantes Neuladen, bei dem alte Mitarbeiter mit Nginx laufende Anforderungen abschließen können)
  4. Entfernen Sie alte zwischengespeicherte Daten

Hier ist das auf Ubuntu 16.04 LTS zugeschnittene Skript mit dem Cache unter /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

Und falls es hilfreich ist, hier ist die Nginx-Konfiguration, die wir verwenden:

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;
    }
}
David Eyk
quelle
5

Überprüfen Sie für diejenigen, bei denen andere Lösungen nicht funktionieren, ob Sie einen DNS-Dienst wie CloudFlare verwenden . Aktivieren Sie in diesem Fall den "Entwicklungsmodus" oder verwenden Sie das Tool "Cache leeren".

Leopoldo Sanczyk
quelle
5

Bitte beachten Sie, dass proxy_cache_bypass Ihnen eine Welt voller Verletzungen bereiten kann, wenn Ihre App keine zwischenspeicherbare Antwort für diese bestimmte Anforderung zurückgibt, bei der Sie sie auslösen.

Wenn zum Beispiel die App ein Cookie mit jedem ersten Anfrage sendet, dann ein Skript , das Trigger über curl proxy_pass_bypass wird wahrscheinlich das Cookie in der Antwort, und nginx wird nicht , dass die Antwort verwenden , um das zwischengespeicherte Element zu aktualisieren.

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

Achten Sie darauf, den richtigen Pfad richtig anzugeben.

colapsnux
quelle
3

Wenn Sie versucht haben, die Nginx-Cache-Dateien zu löschen, und diese entweder nicht oder nur zeitweise funktioniert haben, sehen Sie sich Ihre Einstellung für open_file_cache an. Wenn dies aktiviert und konfiguriert ist, um einen Dateideskriptor für längere Zeit zwischenzuspeichern, wird Nginx möglicherweise auch dann noch eine Version der zwischengespeicherten Datei anzeigen, wenn Sie sie von der Festplatte gelöscht haben. Ich musste open_file_cache_valid auf 1s reduzieren (ich bin nicht sicher, ob dies im Wesentlichen dem vollständigen Deaktivieren des Dateicaches entspricht).

SilentMiles
quelle
2

Auf meinem Server befindet sich der Nginx-Cache-Ordner unter /data/nginx/cache/

Also habe ich es nur entfernt: sudo rm -rf /data/nginx/cache/

Hoffe das wird jedem helfen.

Brilliant-DucN
quelle
2

Wenn Sie den Cache bestimmter Dateien leeren möchten, können Sie die proxy_cache_bypassDirektive verwenden. Das ist wie man es macht

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

Wenn Sie nun den Cache umgehen möchten, greifen Sie auf die Datei zu, indem Sie den Parameter nocache übergeben

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

Sajjad Ashraf
quelle
1
Ich denke, dies könnte verwendet werden, um die Bandbreite Ihrer Website anzugreifen und zu verbrauchen.
Marcelo Agimóvel
1
Umgeht dies nicht einfach den Cache für die aktuelle Anfrage ( app.css?nocache=true), während die Originaldatei (ohne Abfrage) im Cache ( app.css) verbleibt ?
AdrianTNT
1

Sie können die Konfiguration in der Datei nginx.conf wie folgt hinzufügen.

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

    ....
}
...
}

Von oben wird in / tmp / dynamisch ein Ordner mit dem Namen "nginx_cache" erstellt, um zwischengespeicherten Inhalt zu speichern.

austinzmchen
quelle
1

Es gibt eine richtige Methode, um nur Cache-Dateien zu entfernen, die mit einem KEY übereinstimmen. Beispielsweise:

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

Dadurch werden alle Cache-Dateien entfernt, die mit KEY "yahoo / *" übereinstimmen, wenn in nginx.conf Folgendes festgelegt wurde:

proxy_cache_key $host$uri;
Ivan BlaBlaBla
quelle
1

Wir verwenden Nginx zum Zwischenspeichern vieler Dinge. Das Cache-Verzeichnis enthält Zehntausende von Elementen. Um Elemente zu finden und zu löschen, haben wir einige Skripte entwickelt, um diesen Prozess zu vereinfachen. Das Repository für diese Skripte finden Sie unten:

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

Die Idee ist einfach. So erstellen Sie einen Index des Caches (mit Cache-Schlüsseln und entsprechenden Cache-Dateien) und suchen in dieser Indexdatei. Es hat uns wirklich geholfen, das Auffinden von Elementen (von Minuten bis zu Sekunden) zu beschleunigen und sie entsprechend zu löschen.

Zafer
quelle
1

In meinem Fall touchsieht diese CSS-Datei so aus, als ob Ressourcen geändert wurden (tatsächlich touchändert sich nichts an der Datei, außer der letzten Änderungszeit), sodass Browser und Nginx die neuesten Ressourcen anwenden

Noah
quelle
0

Ich hatte ein ähnliches Problem:

Systemeinrichtung und Problem: (Auf einer Virtualbox bin ich Webhosting mit Ubuntu und Nginx - PHP-Webseitenaktualisierungen spiegelten keine Änderungen an der externen CSS-Datei wider). Ich entwickle eine Website auf einem Windows-Computer und übertrage Dateien über einen freigegebenen Ordner an nginx. Es scheint, dass Nginx keine Änderungen an der CSS-Datei aufnimmt (eine Aktualisierung in irgendeiner Weise hilft nicht. Das Ändern des CSS-Dateinamens hat nur funktioniert).

Lösung: Suchen Sie auf der VM die freigegebene Datei (in meinem Fall die CSS-Datei). Öffnen Sie mit Nano und vergleichen Sie es mit der Datei in Windows Share (sie erscheinen identisch). Speichern Sie auf der VM die freigegebene Datei mit nano. Alle Änderungen werden jetzt im Browser angezeigt. Ich bin mir nicht sicher, warum das funktioniert, aber in meinem Fall.

UPDATE: Nach dem Neustart des VM-Servers ist das Problem zurückgekehrt. Durch Befolgen der Anweisungen unter Lösung reagierte das CSS erneut auf Aktualisierungen

Herr G.
quelle
-1

In meinem Fall war es der aktivierte Opcache in /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Wenn Sie den Wert auf 0 setzen, lädt der Server die neueste Version der (PHP-) Dateien.

Tech Nomad
quelle