Wie richte ich Nginx als Caching-Reverse-Proxy ein?

143

Ich habe kürzlich erfahren, dass Nginx die Reverse-Proxy-Funktion um Caching erweitert hat. Ich sah mich um, konnte aber nicht viele Informationen darüber finden.

Ich möchte Nginx als Caching-Reverse-Proxy vor Apache / Django einrichten: Nginx-Proxy-Anforderungen für einige (aber nicht alle) dynamische Seiten an Apache senden, die generierten Seiten zwischenspeichern und nachfolgende Anforderungen für diese Seiten aus dem Cache bereitstellen.

Idealerweise möchte ich den Cache auf zwei Arten ungültig machen:

  1. Legen Sie ein Ablaufdatum für das zwischengespeicherte Element fest
  2. So machen Sie das zwischengespeicherte Element explizit ungültig Wenn mein Django-Backend beispielsweise bestimmte Daten aktualisiert hat, möchte ich Nginx anweisen, den Cache der betroffenen Seiten ungültig zu machen

Ist es möglich, Nginx so einzustellen? Wie?

Fortsetzung
quelle
Nicht getestet, aber von gumroad.com/l/ngx_purge : "ngx_purge ist ein reines Lua-Modul für Nginx, mit dem Benutzer Objekte aus dem nginx-Cache löschen können."
Jaime Hablutzel

Antworten:

97

Ich glaube nicht, dass es eine Möglichkeit gibt, zwischengespeicherte Elemente explizit ungültig zu machen, aber hier ist ein Beispiel dafür, wie der Rest erledigt wird. Update: Wie von Piotr in einer anderen Antwort erwähnt, gibt es ein Cache-Bereinigungsmodul , das Sie verwenden können. Sie können auch eine Aktualisierung eines zwischengespeicherten Elements erzwingen, indem Sie proxy_cache_bypass von nginx verwenden. Weitere Informationen finden Sie unter Cherians Antwort .

In dieser Konfiguration werden nicht zwischengespeicherte Elemente von example.net abgerufen und gespeichert. Die zwischengespeicherten Versionen werden zukünftigen Clients bereitgestellt, bis sie nicht mehr gültig sind (60 Minuten).

Ihre Cache-Control- und Expires-HTTP-Header werden berücksichtigt. Wenn Sie also explizit ein Ablaufdatum festlegen möchten, können Sie dies tun, indem Sie die richtigen Header in den von Ihnen verwendeten Proxys festlegen.

Es gibt viele Parameter, die Sie einstellen können. Weitere Informationen hierzu finden Sie in der Dokumentation zum nginx-Proxy-Modul, einschließlich Einzelheiten zur Bedeutung der verschiedenen Einstellungen / Parameter: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}
Casey
quelle
7
Dies ist ein vernünftiger erster Schritt für neue Apps, die nicht über 20 KBit / s verfügen.
5
@Barry was soll der zweite Schritt sein?
Jürgen Paul
42
@Legit - Ich weiß es nicht, aber traditionell ist der letzte Schritt "Profit" :-)
Stephen C
Leider funktioniert es nicht mit Nginx 1.11. Seit dem letzten Update vor ca. 3 Jahren scheint dies nicht mehr die Lösung zu sein.
Izogfif
Was bedeutet das inactive=600m:? Ist es nicht inactivean der Zeit zu sein? `[inactive=time]
NeverEndingQueue
47

Sie können zwischengespeicherte Seiten durch spezifisch ungültig machen

proxy_cache_bypass       

Angenommen, Sie möchten eine Seite zwischenspeichern, stellen Sie den Cache auf diese Weise ein

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Nun, wenn Sie diese Seite ungültig machen und erneut zwischenspeichern möchten

Führen Sie mit dem Header einen geheimen Curl-Anruf durch

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Es wird ungültig und zwischenspeichern.

Funktioniert ab Nginx 0.7.

Als zusätzlichen Bonus add_header X-Cache-Statuskönnen Sie überprüfen, ob die Seite aus dem Cache stammt oder nicht.

Cherian
quelle
Dadurch können zwischengespeicherte Seiten nur aktualisiert werden, wenn die neue Seite auch zwischengespeichert werden kann. Wenn Sie eine Seite entfernt haben (404 oder andere Fehler werden jetzt vom Backend geliefert), sendet die Seite jetzt ein Set-Cookie oder einen "Content-Control: private" -Header, der zwischengespeicherte Inhalt wird nicht "ungültig".
Rbu
36

Ich schlage vor, Sie versuchen es mit Varnish . Lack ist speziell als Reverse-Proxy-Cache konzipiert. Es werden alle Cachesteuerungsheader berücksichtigt, die Sie vom Ursprungsserver senden, wodurch Ihre erste Anforderung erfüllt wird.

Für Ihre zweite Anfrage explizite Ungültigerklärung. Ich empfehle dringend, den Namen der URL der Ressource zu ändern, die Sie für ungültig erklären möchten, indem Sie die Datei umbenennen oder eine Art Cache-Buster für Abfragezeichenfolgen verwenden. Varnish verfügt zwar über eine PURGEOperation, mit der die Ressource aus dem Cache von Varnish entfernt wird, Sie haben jedoch keine Kontrolle über andere Caches zwischen Ihnen und dem Benutzer. Wie Sie bereits gesagt haben, dass Sie eine Ressource explizit löschen möchten, helfen Ihnen die standardmäßigen HTTP-Steuerelement-Header nicht weiter. In diesen Fällen ist es am einfachsten, die Zwischenspeicherung einer Ressource zu umgehen, wenn Sie sie umbenennen.

Dave Cheney
quelle
Könnten Sie erklären, was Sie mit "Umbenennen der Datei oder Verwenden einer Art Query-String-Cache-Buster" gemeint haben? Ich bin mir nicht sicher, warum es keine gute Idee ist, eine Operation wie PURGE zu verwenden.
Fortsetzung
5
+1 für Lack. Es ist immer viel besser, die richtigen Werkzeuge für den Job zu verwenden.
Tom O'Connor
4
@below: In den Bereichen Leistung und Vielseitigkeit gibt es fast keine Hoffnung, Lack zu berühren. Dies wird von einem der führenden FreeBSD-Kernel-Entwickler und einem engagierten Team mit Sitz in Europa unterstützt. Lack wird bei twitter, heroku und vielen anderen produziert.
2
Das einfachste Beispiel für einen Cache-Buster ist das Anhängen einer Versionsnummer in einer Abfragezeichenfolge an eine statische Ressource, sodass style.css zu style.css? 123 wird. Wenn Sie eine neue Version der Datei pushen möchten, ändern Sie die URL der Ressource in style.css? 124, und jetzt wird sie von den Caches als völlig neues Asset aufgenommen, das separat zwischengespeichert werden soll. Apache liefert die Datei style.css mit einer angehängten Abfragezeichenfolge, sodass keine Änderungen an der eigentlichen Datei erforderlich sind.
chmac
3
Wenn möglich, ist es am besten, den Cache-Buster in den Dateinamen selbst einzufügen, z. B. style.v123.cssweil einige Caches keine Anforderungen mit einer Abfragezeichenfolge zwischenspeichern.
Noah McIlraith
8

Zum Ungültigmachen ausgewählter Seiten können Sie den Patch "cache_purge" für nginx-0.8.x verwenden, der genau das tut, was Sie wollen;)

Es ist hier erhältlich .


quelle
8

Die meisten Caching-Tools (Citrix) ermöglichen eine erzwungene Aktualisierung (Strg + R), um eine zwischengespeicherte Seite neu aufzufüllen.

Hier ist ein Trick, den ich gefunden habe, um etwas Ähnliches in Nginx zu tun.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Dies setzt voraus, dass der Cache-Control-Header bei der Ausführung von Strg + R in Ihrem Browser den Wert max-age = 0 in seiner Anforderung hat. Ich weiß, dass Chrome dies tut, aber ich habe es nicht in anderen Browsern versucht. Das Hinzufügen weiterer Header-Felder kann einfach sein, indem Sie einfach weitere if-Anweisungen hinzufügen, mit denen die $eacVariable auf 1 gesetzt wird.

Randy Wallace
quelle
5

Caching ist eine ziemlich neue Funktion in Nginx (und vorerst nicht so gut dokumentiert), aber stabil genug, um in der Produktion verwendet zu werden.

SaveTheRbtz
quelle
4

Ich glaube, NginxHttpProxyModule kann http-Anfragen verarbeiten. Suchen Sie nach den Anweisungen, die beginnen mit:

proxy_cache

Ja, es ist möglich, das Cache-Verhalten über Anweisungen wie die folgenden zu steuern:

proxy_cache_valid
Taras Chuhay
quelle
3

Aufgrund der Tatsache, dass Sie keine Dokumente darauf finden können, wäre ich ein wenig besorgt, wenn ich mich in der Produktion darauf verlassen würde. Haben Sie an Lack gedacht? Es ist meine "Nginx von Reverse-Proxies", klein, leicht, macht einen Job und macht es gut.

womble
quelle
Die Dokumentation ist hier: wiki.nginx.org/NginxHttpProxyModule#proxy_cache
rmalayter
2

Wenn Sie in Ihrer Anwendung eTags verwenden und nginx voranstellen, wird der Ablauf für Sie erledigt, da der Cache ungültig wird, wenn sich das eTag ändert.

Martin Murphy
quelle
"Ja wirklich?" Es sieht so aus, als würde ngnix mit dem etag übereinstimmen und niemals mit der Anwendung sprechen, um herauszufinden, ob es ein aktualisiertes etag gibt.
John Naegle
2

Sie können den Cache-Ablauf von Nginx mit mehreren Anweisungen / Parametern steuern:

  • proxy_cache_valid 200 302 10m;
  • Hinzufügen eines der folgenden HTTP-Header (Priorität ist wichtig - siehe meinen Blog-Beitrag ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • der inactiveParameter in der proxy_cache_pathDirektive:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Ich empfehle meinen Blog-Beitrag, wenn Sie mehr über Nginx-Caching erfahren möchten.

Das Thema Bereinigung ist wirklich interessant, da diese Funktion nur in Nginx Plus (Nginxs Commercial Edition) vorhanden ist. Ich mag @ Randy-Wallace Antwort. Es gibt aber auch andere Möglichkeiten wie das Modul ngx_cache_purge .

Am einfachsten können Sie die zwischengespeicherte Datei manuell entfernen:

  • Generieren Sie Ihren Hash-Schlüssel:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • entferne die Datei aus dem Dateisystem:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
czerasz
quelle
1

Für zukünftige Besucher: In der Zwischenzeit ist der Nginx Reverse Proxy Caching integriert und die Dokumente sind verfügbar unter:

Syntax: proxy_cache zone | aus;

Voreinstellung: proxy_cache off;

Kontext: http, Server, Standort

Definiert eine gemeinsam genutzte Speicherzone, die zum Zwischenspeichern verwendet wird. Dieselbe Zone kann an mehreren Stellen verwendet werden. Parameterwert kann Variablen enthalten (1.7.9). Der Parameter off deaktiviert das Caching, das von der vorherigen Konfigurationsebene übernommen wurde.

Tarik Huclaslun
quelle
Hallo Tarik, die Frage war sehr spezifisch, was erreicht werden muss, und es ist ein bisschen mehr als "nur Cache aktivieren".
Asdmin
0
fastcgi_cache_path / opt / nginx-cache levels = 2: 2 keys_zone = img: 50m;

    location / img / {
        fastcgi_pass $ backend;
        include fcgi_params;
        fastcgi_intercept_errors off;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid any 1m;
        fastcgi_hide_header Set-Cookie;
    }

Dadurch wird ein Cache für / img / location erstellt. Es befindet sich in / opt / nginx-cache. Objekte werden 1 Minute zwischengespeichert.

Sie können anstelle von jedem andere Antwortcodes schreiben.

Jetzt können Sie den Cache für ausgewählte Seiten nicht mehr ungültig machen. Vielleicht wird es in 0.8.x möglich sein.

lexsys
quelle
Die ursprüngliche Frage betraf die Verwendung von Nginx vor Apache, nicht vor der von Nginx behandelten FastCgi-Anwendung.
Graham Dumpleton
0

Es gibt ein Nginx- Plugin namens Ncache, das behauptet, "ein Web-Cache-System auf der Basis von Nginx-Webservern zu sein. Schneller und effizienter als Squid."

sajal
quelle