wake-up-neo.com

Wie lösche ich den Cache von Nginx?

Ich benutze Nginx als Frontserver, ich habe die CSS-Dateien modifiziert, 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, um es zu löschen.

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

Was sollte ich jetzt tun?

221
Freewind

Ich hatte genau das gleiche Problem - ich habe meine Nginx in Virtualbox ausgeführt. Ich hatte kein Caching aktiviert. Aber es sieht so aus, als ob sendfile in nginx.conf Auf on gesetzt wurde und dies das Problem verursachte. @kolbyjack hat es oben in den Kommentaren erwähnt.

Als ich sendfile ausschaltete, funktionierte es einwandfrei.

Das liegt daran:

Sendfile wird zum "Kopieren von Daten zwischen einem Dateideskriptor und einem anderen" verwendet und hat anscheinend echte Probleme, wenn es in einer Umgebung mit virtuellen Maschinen ausgeführt wird, oder zumindest, wenn es ü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

177

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

proxy_cache_bypass $http_secret_header;

und als Bonus können Sie diesen Header zurückgeben, um zu sehen, ob Sie ihn aus dem Cache (gibt "HIT" zurück) oder vom Content-Server (gibt "BYPASS" zurück) erhalten haben.

add_header X-Cache-Status $upstream_cache_status;

um die zwischengespeicherte Datei zu löschen oder zu aktualisieren, verwenden Sie curl oder einen anderen Client, 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 der Inhalt des Caches ersetzt.

95
Jason Wiener

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

Wenn Sie dies jedoch getan haben, dann nach Angaben des Autors von nginx reicht es aus, alle Dateien aus dem Cache-Verzeichnis zu entfernen.

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

57
Gnarfoz

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 zu aktualisieren.

20
Łukasz Sokolik

In dieser Frage gibt es zwei Antworten.

  • Eine für Nginx als Reverse Cache
  • Ein weiteres Verfahren zum Löschen des Browser-Cache durch Kopfzeileneingabe (dieses)

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

Ich fand das nützlich

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

Suchen und, falls gefunden, löschen.

10
agustik

In meiner Nginx-Installation stellte ich fest, dass ich gehen musste 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 können, funktioniert dies möglicherweise auch für Sie. Sei sehr vorsichtig mit dem rm -rf Befehl, wenn Sie sich im falschen Verzeichnis befinden, können Sie Ihre gesamte Festplatte löschen.

10
Ganesh Shankar

Ich führe ein sehr einfaches Bash-Skript aus, das alle 10 Sekunden benötigt, um den Job auszuführen, und schicke 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
7
MitchellK

Ich hatte dieses Problem auch.

  • Konnte keinen nginx/cache-Ordner finden
  • sendfile war aus

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

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

6
Asle

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

5

Bitte beachten Sie, dass proxy_cache_bypass Sie schwer verletzen kann, wenn Ihre App keine zwischenspeicherbare Antwort auf diese spezielle Anforderung zurückgibt, bei der Sie sie auslösen.

Wenn Ihre App zum Beispiel bei jeder ersten Anfrage ein Cookie sendet, dann wird ein Skript, das proxy_pass_bypass über curl auslöst, dieses Cookie wahrscheinlich in der Antwort erhalten, und nginx wird nicht diese Antwort verwenden, um das zwischengespeicherte Element zu aktualisieren.

5
dwt

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

In Summe:

  1. Verschieben Sie den Cache-Ordner an einen neuen Speicherort (auf demselben Dateisystem!) (Dies stört keine offenen Dateideskriptoren).
  2. Erstellen Sie den ursprünglichen Cache-Ordner neu, leer
  3. Nginx neu laden (elegant neu laden, wobei mit Nginx alte Arbeiter laufende Anfragen abschließen können)
  4. Alte zwischengespeicherte Daten entfernen

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

Wer versucht hat, die Nginx-Cache-Dateien zu löschen, und entweder nicht oder nur zeitweise funktioniert hat, sollte sich Ihre Einstellung für open_file_cache ansehen. Wenn dies aktiviert und konfiguriert ist, um einen Dateideskriptor über einen längeren Zeitraum zwischenzuspeichern, wird Nginx möglicherweise weiterhin eine Version der zwischengespeicherten Datei angezeigt, selbst nachdem Sie sie von der Festplatte gelöscht haben. Ich musste open_file_cache_valid auf 1s reduzieren (ich bin mir nicht sicher, ob dies im Wesentlichen mit dem vollständigen Deaktivieren des Dateicaches identisch ist).

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

Achten Sie darauf, den richtigen Pfad anzugeben.

3
colapsnux

Wenn Sie den Cache bestimmter Dateien löschen möchten, können Sie das proxy_cache_bypass Richtlinie. 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

2
Sajjad Ashraf

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.

1
Brilliant-DucN

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.

0
austinzmchen

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

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

Dies entfernt alle Cache-Dateien, die mit KEY "yahoo/*" übereinstimmen, wenn in der nginx.conf folgendes gesetzt wurde:

proxy_cache_key $Host$uri;
0
Ivan BlaBlaBla

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.

0
Tech Nomad

Ich hatte ein ähnliches Problem:

Systemeinrichtung und Problem: (Auf einer Virtualbox, auf der ich mit Ubuntu und Nginx webhoste - PHP wurden die Änderungen an der externen CSS-Datei nicht berücksichtigt.) Ich entwickle eine Website unter Windows und übertrage Dateien über einen freigegebenen Ordner an Nginx. Es scheint, dass Nginx keine Änderungen an der CSS-Datei aufnimmt (das Aktualisieren hilft in keiner Weise. Das Ändern des CSS-Dateinamens ist nur eine Sache, die funktioniert hat).

Lösung: Auf VM gemeinsam genutzte Datei finden (CSS-Datei in meinem Fall). Öffnen Sie mit Nano und vergleichen Sie mit der Datei in Windows Share (sie sehen identisch aus). Auf VM gemeinsam genutzte Datei mit nano speichern. 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 trat das Problem erneut auf. Wenn Sie die Anweisungen unter Lösung befolgen, reagiert der CSS erneut auf Aktualisierungen

0
Mr G