Heim  >  Artikel  >  Backend-Entwicklung  >  Nginx-Cache-Bereinigung

Nginx-Cache-Bereinigung

WBOY
WBOYOriginal
2016-08-08 09:22:271207Durchsuche

Mehrere Möglichkeiten zum Zwischenspeichern des Caches in Nginx

1. Die Funktion „proxy_cache“ von Nginx Ab nginx-0.7 Ab Version .44 unterstützt Nginx eine formellere Cache-Funktion ähnlich wie Squid. Dieser Cache speichert Links, nachdem sie mit der MD5-Codierung gehasht wurden, sodass er jeden Link unterstützen kann und auch Nicht-200-Status wie 404/301/302 unterstützt. Konfiguration: Konfigurieren Sie zunächst einen Cache-Speicherplatz (unter http) >Der Parameterpfad „proxy_temp_path“ muss sich außerdem auf derselben Partition wie der oben genannte „proxy_cache_path“ befinden, andernfalls wird ein Fehler gemeldet. Beachten Sie, dass diese Konfiguration außerhalb des Server-Tags liegt. Ebenen geben an, dass der Cache-Speicherplatz über zwei Ebenen von Hash-Verzeichnissen verfügt. Das Verzeichnis der ersten Ebene besteht aus 1 Buchstaben und die zweite Ebene besteht aus 2 Buchstaben . Der Dateiname ähnelt /xok/to/cache/e/4a/0f1019b0db2f97d17c2238c0271a74ae; Inaktiv 5 m bezieht sich auf den Cache-Standardwert. Die Dauer beträgt 5 Minuten. 1 g von max_size bedeutet, dass der gesamte Cache-Speicherplatz 1 g beträgt und der Festplatten-Cache-Speicherplatz diesen Wert überschreitet Der Cache sollte einmal pro Minute geleert werden. Standort / { Proxy_Pass http://xok.la/; Proxy_cache xok1;#Use xok1 this keys_zone Proxy_cache_valid 200 302 1H;#200 und 302 Statuscode für 1 Stunde Proxy_CACHE_VALID 301 1d;# 301 Statuscode wird für einen Tag gespeichert Proxy_cache_valid any 1m; Geben Sie hier ein häufig verwendetes Beispiel:

location ~ ^/(xx|yy).action{
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header 🎜>proxy_cache_key $host$uri$is_args$arg_pageNo$arg_subjectId;
//Siehe Erklärung 2
proxy_cache_methods GET POST;proxy_cache_valid 200 301 302 5s;
proxy_cache_use_stale Fehler Timeout beim Aktualisieren von http_404 http_500 http_502 http_503;
//Siehe Erklärung 3proxy_cache_lock on;
//Siehe Erklärung 4
proxy_cache_lock_timeout 5s;
proxy_pass http://localhost;}
Erklärung 1: add_header X-Cache $upstream_cache_status macht es für uns bequem, den Cache-Trefferstatus über den Antwortheader zu beobachten.

nginx stellt die Variable $upstream_cache_status bereit, um den Status des Caches anzuzeigen. Wir können der Konfiguration einen http-Header hinzufügen, um diesen Status anzuzeigen, ähnlich wie bei Squid Effect .

$upstream_cache_status enthält die folgenden Status:
·MISS Miss, die Anfrage wird an das Backend gesendet

·HIT Cache Hit ·EXPIRED Der Cache ist abgelaufen und die Anfrage wird an das Backend gesendet

·UPDATING Der Cache wird aktualisiert , die alte wird verwendet. Die Antwort von ·STALE Backend erhält die abgelaufene Antwort von



Erklärung 2:

proxy_cache_key $host$uri$is_args$arg_pageNo$arg_subjectId; gibt normalerweise den Cache-Schlüssel an URL. Achten Sie hier auf zwei Variablen:

(1) $is_args'?' Fragezeichen

(2) $args; repräsentiert alle Parameter nach dem Fragezeichen


Ich denke, es ist wichtiger, die Schreibweise des Beispiels hier zu verstehen Die Schreibmethode zum Angeben einiger Parameter, pageNo und Es gibt zwei Parameter, subjectId, und andere Parameter werden ignoriert. Wenn beispielsweise ein Zeitstempel hinzugefügt wird, kann der Zeitstempel ignoriert werden, da sonst der Cache nie erreicht wird.

Erklärung 3:

proxy_cache_use_stale Fehler Timeout Aktualisierung http_404 http_500 http_502 http_503;

proxy_cache_use_stale Bei der Angabe, welche Situation auf dem Backend-Server auftritt, kann Nginx Abgelaufener Cache verwendet werden.

Wenn beispielsweise eine Aktualisierung angegeben ist,
wird sichergestellt, dass nur ein Thread zum Aktualisieren des Caches vorhanden ist, und Der Cache in diesem Thread wird gerade aktualisiert. Andere Threads reagieren nur auf die abgelaufene Version, die sich derzeit im Cache befindet.

Erklärung 4:

proxy_cache_lock on;

#Definieren Sie dieselbe Anfrage und lassen Sie nur eine zu Gleichzeitig wird die Anfrage an das Backend gesendet und ein neuer #-Eintrag entsprechend dem Proxy_cache_key in den Speicher geschrieben und das Proxy_cache_lock_time-Timeout direkt freigegeben

proxy_cache_lock on |off #default off

proxy_cache_lock_timeout time #default 5s

Angehängt Hier sind einige Einführungen: 1 Proxy_cacheSyntax: Proxy_Cache-Zonenname;Standardwert: KeineVerwenden Sie die Felder: http, Server, StandortLegen Sie den Namen eines Cache-Bereichs fest. Derselbe Bereich kann an verschiedenen Orten verwendet werden. Nach 0.7.48 folgt der Cache den „Expires“, „Cache-Control: no-cache“, „Cache-Control: max-age=XXX“ und anderen des Backends. Allerdings ignoriert Nginx derzeit einige Cache-Kontrollanweisungen, wie zum Beispiel „private“ und „no-store“. Ebenso verarbeitet Nginx den „Vary“-Header während des Cache-Prozesses nicht, um sicherzustellen, dass einige private Daten nicht vorhanden sind Für alle Benutzer sichtbar. Das Backend muss den Header „no-cache“ oder „max-age=0“ festlegen, sonst kann der Proxy_cache_key vom Benutzer angegebene Daten wie $http_cookie_xxx enthalten Da private Daten nicht zwischengespeichert werden, kann der Speicherort separat angegeben werden, um private und öffentliche Daten zu trennen. Die Caching-Anweisung basiert auf Proxy-Puffer (Puffer). Wenn „proxy_buffers“ auf „off“ gesetzt ist, wird das Caching nicht wirksam.

2 Proxy-Cache-Schlüssel

Syntax: Proxy_cache_key line;
Standardwert: $scheme$proxy_host$request_uri;
Verwenden Sie Felder: http, Server, Standort Die
-Direktive gibt den im Cache enthaltenen Cache an Schlüsselwörter.

proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_key "$scheme$host$request_uri";

3 Proxy-Cache-Pfad

Syntax: Proxy-Cache-Pfad Pfad [Ebenen = Anzahl] Tasten_z [inaktiv =time] [max_size=size];Standardwert: KeineFeld verwenden: http-Direktive gibt den Cache-Pfad und einige andere Parameter an. Die zwischengespeicherten Daten werden gespeichert in der Datei. Der zwischengespeicherte Dateiname und der Schlüssel sind die MD5-Codes der Proxy-URL. Der Parameter „levels“ gibt die Anzahl der zwischengespeicherten Unterverzeichnisse an, zum Beispiel:
proxy_cache_path /data/nginx/cache levels=1:2 keys_z/td>

Der Dateiname ähnelt: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c Alle aktiven Schlüssel und Metadaten werden im Shared-Memory-Bereich gespeichert. Dieser Bereich wird mit dem Parameter „keys_zone“ angegeben. Wenn die zwischengespeicherten Daten nicht innerhalb der durch den inaktiven Parameter angegebenen Zeit angefordert werden Der Standardwert für die Inaktivität beträgt 10 Minuten. Der Cache-Manager-Prozess steuert die Cache-Größe der Festplatte, die im Parameter max_size definiert ist. Nach Überschreiten der Größe werden die am wenigsten verwendeten Daten gelöscht. Die Größe des Bereichs wird im Verhältnis zur Anzahl der zwischengespeicherten Seiten festgelegt. Die Metadatengröße einer Seite (Datei) wird vom Betriebssystem bestimmt. Sie beträgt 64 Byte unter FreeBSD/i386 und 128 Byte FreeBSD/amd64: Wenn der Bereich voll ist, wird der Schlüssel gemäß LRU (zuletzt verwendeter Algorithmus) verarbeitet. Proxy_cache_path und Proxy_temp_path sollten im selben Dateisystem verwendet werden.

4 Proxy_Cache_Methoden

Syntax: Proxy_Cache_Methods [GET HEAD POST]; http, server, location
GET/HEAD wird zum Dekorieren von Anweisungen verwendet. Das heißt, Sie können GET/HEAD nicht deaktivieren, selbst wenn Sie nur die folgenden Anweisungseinstellungen verwenden:

proxy_cache_methods POST;
5 Proxy_cache_min_uses

Syntax: Proxy_cache_min_uses the_number;

Standardwert: Proxy_cache_min_uses 1;Verwendete Felder: http, Server, StandortWie oft die Antwort nach der Abfrage zwischengespeichert wird, Standard 1. 6 Proxy_cache_valid

Syntax: Proxy_cache_valid Reply_code [reply_code ...] Zeit;

Standardwert: KeineVerwendete Felder: http, Server, Standort
Stellen Sie unterschiedliche Cache-Zeiten für unterschiedliche Antworten ein, zum Beispiel:

proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 5m; proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;7 Proxy_cache_use_stale

Um eine Cache-Ungültigmachung zu verhindern (wenn mehrere Threads gleichzeitig den lokalen Cache aktualisieren), können Sie den Parameter „updating“ angeben, der sicherstellt, dass nur ein Thread den Cache aktualisiert und andere Threads ihn aktualisieren Cache, während dieser Thread den Cache aktualisiert. Der Thread antwortet nur auf die abgelaufene Version, die sich derzeit im Cache befindet.

Konfiguration codieren und konfigurieren:

Hooks (d. h. Rückrufe) für jede Anweisung sind in ngx_http_proxy_module.c definiert, die beim Lesen der Konfigurationsdatei aufgerufen werden. Bei der Konfiguration müssen Sie lediglich „HTTP_CACHE“ auf YES setzen (die Zeile HTTP_CACHE finden Sie in auto/options). Die Direktive „proxy_cache_purge“ erfordert das Herunterladen von Nginx Modul „Cache Purge“ in Add-ons und verwenden Sie „--add-module=", um den Code bei der Konfiguration zu laden.


Die folgenden Anhänge enthalten einige andere Nginx-Cache-Inhalte, werden jedoch derzeit nur noch selten verwendet. Wenn Sie interessiert sind, können Sie mehr erfahren:

2. Einer der herkömmlichen Caches (404) Diese Methode besteht darin, den 404-Fehler von Nginx an das Backend weiterzuleiten und dann Proxy_store zum Speichern der Seite zu verwenden vom Backend zurückgegeben. Standort / { Stammverzeichnis /home/html/;#Home-Verzeichnis läuft 1 Tag ab;#Ablauf des Webs Seitenzeit error_page 404 =200 /fetch$request_uri;#404 ​​​​Geleitet zum /fetch-Verzeichnis } Speicherort /fetch/ {#404 Hierher geleitet intern;#Gibt an, dass auf dieses Verzeichnis nicht direkt extern zugegriffen werden kann läuft 1 Tag ab;#Ablaufzeit des Webs Seite alias /home/html/;#Die Dateisystemadresse des virtuellen Verzeichnisses muss mit dem Speicherort/ übereinstimmen. Proxy_store speichert die Datei in diesem Verzeichnis Proxy_pass http:/ /xok.la/;#Backend-Upstream-Adresse,/fetch ist auch ein Proxy Proxy_set_header Accept-Encoding '';#Lassen Sie das Backend keine Komprimierung zurückgeben (gzip oder entleeren) Inhalt, das Speichern komprimierter Inhalte wird Probleme bereiten. Proxy_store on;#Geben Sie Nginx an, um die vom Proxy zurückgegebene Datei zu speichern Proxy_temp_Path /home/tmp;#Temporäres Verzeichnis, dieses Verzeichnis muss sich im selben Verzeichnis befinden als /home/html Innerhalb einer Festplattenpartition } Bitte beachten Sie bei der Verwendung auch, dass Nginx Berechtigungen für /home/tmp und haben muss /home/html Für die Berechtigung zum Schreiben von Dateien ist nginx im Allgemeinen so konfiguriert, dass es als Nobody-Benutzer ausgeführt wird. Auf diese Weise müssen diese beiden Verzeichnisse „nobody“ sein und so eingestellt werden, dass sie exklusiv für den Nobody-Benutzer sind auch chmod 777, aber alle erfahrenen Systemadministratoren werden es empfehlen. Verwenden Sie 777 nicht beiläufig.3. Traditioneller Cache 2 (!-e)Das Prinzip ist im Grunde das gleiche wie beim 404-Sprung, aber prägnanter: Standort / { root /home/html/; Proxy_Store auf; Proxy_Set_Header Accept-Encoding ''; 🎜> Proxy_Pass http://xok.la/; } } Sie können sehen, dass diese Konfiguration im Vergleich zu 404 viel Code spart. Sie verwendet !-f, um festzustellen, ob die angeforderte Datei im Dateisystem vorhanden ist. Wenn sie nicht vorhanden ist, wird sie an das Backend übergeben Dieselbe Methode wird verwendet, um „proxy_store save“ zurückzugeben. Beide traditionellen Caches haben grundsätzlich die gleichen Vor- und Nachteile: Nachteil 1: Dynamische Links mit Parametern werden nicht unterstützt, wie etwa read.php? =1, da Nginx nur den Dateinamen speichert, wird dieser Link daher nur als read.php im Dateisystem gespeichert, sodass beim Zugriff des Benutzers auf read.php?id=2 falsche Ergebnisse zurückgegeben werden. Gleichzeitig werden die Homepage und das Sekundärverzeichnis http in der Form http://xok.la/ nicht unterstützt: //xok.la/download/, da Nginx sehr ehrlich ist und eine solche Anfrage gemäß dem Link in das Dateisystem schreibt. Dieser Link ist offensichtlich ein Verzeichnis, sodass das Speichern fehlschlägt. In diesen Fällen ist zum korrekten Speichern ein Umschreiben erforderlich. Nachteil 2: Nginx verfügt über keinen Mechanismus zum Ablaufen und Bereinigen des Caches. Diese zwischengespeicherten Dateien werden dauerhaft auf dem Computer gespeichert gesamtes System. Festplattenspeicher. Zu diesem Zweck können Sie ein Shell-Skript verwenden, um es regelmäßig zu bereinigen, und Sie können dynamische Programme wie PHP schreiben, um Echtzeit-Updates durchzuführen. Nachteil 3: Es können nur 200 Statuscodes zwischengespeichert werden, sodass vom Backend zurückgegebene Statuscodes wie 301/302/404 nicht zwischengespeichert werden, wenn zufällig ein pseudostatischer Link vorhanden ist Wenn eine große Anzahl von Besuchen gelöscht wird, dringt es weiter ein und führt dazu, dass das Backend großen Druck ausübt.Nachteil 4: Nginx wählt nicht automatisch Speicher oder Festplatte als Speichermedium. Natürlich wird es in der aktuellen Konfiguration einen Datei-Caching-Mechanismus auf Betriebssystemebene geben Betriebssystem, sodass es auf der Festplatte gespeichert wird. Sie müssen sich keine großen Sorgen über E/A-Leistungsprobleme machen, die durch große gleichzeitige Lesevorgänge verursacht werden. nginx Der Nachteil des traditionellen Cachings liegt auch in seinen unterschiedlichen Eigenschaften gegenüber Caching-Software wie Squid, sodass es auch als Vorteil angesehen werden kann. In Produktionsanwendungen wird es häufig als Partner von Squid verwendet und kann Links häufig nicht mit ? blockieren, während Nginx deren Zugriff blockieren kann, z. B.: http://xok.la/? und http://xok.la/ wird auf Squid als zwei Links behandelt, sodass Nginx es nur einmal speichert, unabhängig davon, ob der Link zu http://xok wird .la/?1 oder http://xok.la/?123 können von Nginx nicht zwischengespeichert werden, wodurch der Back-End-Host effektiv geschützt wird. nginx speichert das Linkformular sehr ehrlich im Dateisystem, sodass Sie für einen Link dessen Cache-Status und Inhalt auf dem Cache-Computer problemlos überprüfen können, und das können Sie auch problemlos Es lässt sich leicht in Verbindung mit anderen Dateimanagern wie rsync verwenden und ist vollständig eine Dateisystemstruktur. Diese beiden herkömmlichen Caches können Dateien unter Linux in /dev/shm speichern. Im Allgemeinen mache ich dies, damit der Systemspeicher zum Caching verwendet werden kann . Wenn ja, geht die Bereinigung abgelaufener Inhalte viel schneller. Wenn Sie /dev/shm/ verwenden, müssen Sie nicht nur das tmp-Verzeichnis auf die /dev/shm-Partition verweisen, sondern auch die Speicherpartition ändern, wenn viele kleine Dateien und Verzeichnisse vorhanden sind. Anzahl der Inodes und maximale Kapazität: mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm Der obige Befehl wird auf einem Computer mit 3G-Speicher verwendet. Da der standardmäßige maximale Speicher von /dev/shm die Hälfte des Systemspeichers beträgt, also 1500 MB, erhöht dieser Befehl ihn gleichzeitig auf 2500 MB. Die Anzahl der Inodes im SHM-System ist möglicherweise nicht ausreichend, aber das Interessante ist, dass sie nach Belieben angepasst werden kann. Die Anpassung ist etwas konservativ, aber im Grunde ausreichend. 4. Cache basierend auf Memcached nginx unterstützt Memcached, aber die Funktion ist nicht besonders stark und die Leistung ist immer noch sehr gut . location /mem/ { if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" ) { set $memcached_key "$1"; memcached_pass 192.168.6.2:11211; } läuft 70; }Diese Konfiguration wird http://xok /mem/abc gibt den Schlüssel abc von memcached zum Abrufen von Daten an. nginx verfügt derzeit über keinen Mechanismus zum Schreiben in Memcached, daher muss das Schreiben von Daten in Memcached mit der dynamischen Sprache des Hintergrunds erfolgen. Sie können 404 verwenden, um zum Backend zu gelangen Daten schreiben. 5. Basierend auf dem Drittanbieter-Plug-in ncachencache ist ein gutes Projekt, das von Sina Brothers entwickelt wurde memcached, um einen Teil der Squid-Caching-Funktionen zu implementieren, habe ich keine Erfahrung mit der Verwendung dieses Plug-Ins. Sie können sich auf Folgendes beziehen: http://code.google.com/p/ncache/

Das Obige hat die Nginx-Cache-Organisation vorgestellt, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn