Nginx-Cache, der von mehreren Servern gemeinsam genutzt wird

9

Wir haben 8 REST-ish API-Server mit Nginx, die FastCGI mit PHP-FPM verwenden, um Anforderungen zu verarbeiten. Wir verwenden derzeit das FastCGI-Caching von Nginx (Direktiven wie fastcgi_cache_path). Dies bedeutet, dass API-Antworten zwischengespeichert werden, für jeden Server jedoch ein separater Cache vorhanden ist.

Gibt es eine gute Möglichkeit, den Cache-Speicher für alle acht Server freizugeben?

Wir haben erwogen, Redis als gemeinsam genutzten Speicher zu verwenden, aber die verfügbaren Module erfordern anscheinend Anwendungsänderungen. In einigen Fällen möchten wir möglicherweise Antworten zwischenspeichern, die außerhalb unserer Kontrolle liegen (über HTTP an externe APIs). Idealerweise wäre ein Drop-In-Ersatz für das in Nginx integrierte Caching von FastCGI- und HTTP-Antworten verfügbar.

Brad
quelle
Warum machen Sie das Caching nicht auf der Frontend-Ebene (Nginx), sondern auf der Backend-Ebene (PHP-Anwendung)?
Max Kochubey
@hangover Ich sehe keinen Grund, das Rad neu zu erfinden. Der Nginx-Cache funktioniert gut und schnell. Wenn wir den Aufwand für das Ausführen von Anforderungen durch die Anwendung überhaupt vermeiden können, können wir die Dinge schön und schnell halten. Nginx antwortet auf zwischengespeicherte Anfragen für uns in weniger als 5 Millisekunden. Das Starten unserer PHP-Anwendung, selbst wenn sie eine zwischengespeicherte Antwort liefert, wird wahrscheinlich 10x langsamer sein. Das Nginx-Caching funktioniert jetzt gut für uns. Wir müssen diesen Cache nur auf viele Server verteilen.
Brad
1
OK, dann können Sie versuchen, das Nginx SRCache- Modul eines Drittanbieters zu verwenden, um zwischengespeicherte Inhalte in dedizierten Memcached od Redis zu speichern.
Max Kochubey
1
@Brad Das ist hacky, daher werde ich es nicht als Antwort geben: Wir haben derzeit ein nächtliches Skript, das rsync zwischen den Nginx-Cache-Verzeichnissen auf unseren Servern verwendet, um jedes mit den neuesten Cache-Dateien aller anderen auf dem neuesten Stand zu halten. Das Skript endet mit einem ordnungsgemäßen Nginx-Neustart und einer Erfolgsprüfung. Wie ich schon sagte, es ist hacky, aber es funktioniert für uns auf einem Hochdurchsatzsystem.
MVChr
@mVChr Interessant. Haben Sie versucht, rsync oder ähnliches kontinuierlich auszuführen? Am Ende habe ich Redis zum Laufen gebracht, aber dies erlaubt keinen sehr großen Cache, da sich die gesamte Redis-Sammlung im Speicher befinden muss. 16 GB füllen sich schnell mit meiner Bewerbung.
Brad

Antworten:

1

Es scheint einen ziemlich neuen Blog-Beitrag unter https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ zu diesem Thema zu geben. Dieses erste Beispiel kann nützlich sein, wenn Sie mehr als zwei Nginx-Cache-Server ausführen.

Insbesondere der zweite Teil des Beitrags klingt für meinen aktuellen Anwendungsfall interessant, bei dem ich geänderte Elemente automatisch in meine Caches neu crawlen möchte.

Es sollte auch mit der Open Source-Version von NGINX funktionieren. Grundsätzlich funktioniert es durch Proxying der Anforderung, die über jeden NGINX-Server (Nginx-Cache1-> NGinx-Cache2-> Origin-Server) kaskadiert wird. Jeder Server wird vom entsprechenden Upstream zwischengespeichert. Falls gewünscht, kann auch ein HA-Cluster erstellt werden. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

Macbert
quelle