Frage Wie richte ich Nginx als Caching Reverse Proxy ein?


Ich habe kürzlich gehört, dass Nginx Caching zu seiner Reverse-Proxy-Funktion hinzugefügt hat. Ich schaute mich um, konnte aber nicht viele Informationen darüber finden.

Ich möchte Nginx als Caching-Reverse-Proxy vor Apache / Django einrichten: Nginx-Proxy-Anfragen für einige (aber nicht alle) dynamische Seiten an Apache, dann Zwischenspeichern der generierten Seiten und anschließende Anfragen für diese Seiten aus Cache.

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

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

Ist es möglich, Nginx dies zu tun? Wie?


139
2018-06-24 01:35


Ursprung




Antworten:


Ich glaube nicht, dass es eine Möglichkeit gibt, zwischengespeicherte Elemente explizit ungültig zu machen, aber hier ist ein Beispiel, wie man den Rest erledigt. Aktualisieren: Wie von Piotr in einer anderen Antwort erwähnt, gibt es eine Cache-Reinigungsmodul das kannst du benutzen. Sie können auch eine Aktualisierung eines zwischengespeicherten Elements erzwingen, indem Sie nginx's proxy_cache_bypass verwenden - siehe Cherian's Antwort für mehr Informationen.

In dieser Konfiguration werden Elemente, die nicht im Cache gespeichert sind, von example.net abgerufen und gespeichert. Die zwischengespeicherten Versionen werden zukünftigen Kunden 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 allen Bereichen festlegen, für die Sie eine Proxy-Operation durchführen.

Es gibt viele Parameter, die Sie einstellen können. Weitere Informationen zu diesem Thema finden Sie in der Dokumentation zum nginx-Proxy-Modul, einschließlich Details 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;
    }
  }
}

94
2017-09-23 20:01



Dies ist ein vernünftiger erster Schritt für neue Apps, die keine 20k / req / s haben. - Barry
@Barry was soll die zweite steP sein? - Jürgen Paul
@ 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 etwa 3 Jahren sieht es so aus, als wäre das nicht mehr die Lösung. - izogfif


Sie können gezielt Cache wird ungültig gemacht Seiten durch

proxy_cache_bypass       

Angenommen, Sie möchten eine Seite zwischenspeichern und den Cache auf diese Weise festlegen

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

Jetzt, wenn du willst Diese Seite ungültig machen und erneut zwischenspeichern 

Führe einen geheimen Lockruf mit dem Header aus

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

Es wird ungültig und zwischenspeichern.

Funktioniert von nginx 0.7.

Als ein zusätzlicher Bonus der add_header X-Cache-Status kann verwendet werden, um zu überprüfen, ob die Seite aus dem Cache stammt oder nicht.


46
2017-11-26 04:00



Dies kann nur zwischengespeicherte Seiten aktualisieren, wenn die neue Seite ebenfalls zwischengespeichert werden kann. Wenn Sie eine Seite entfernt haben (404 oder andere Fehler werden nun vom Backend bedient), sendet die Seite jetzt einen Set-Cookie oder einen "Content-Control: private" Header, der zwischengespeicherte Inhalt wird nicht "ungültig" gemacht. - rbu


Ich schlage vor, Sie geben Lack ein Versuch. Varnish ist speziell als Reverse-Proxy-Cache konzipiert. Es berücksichtigt alle Cache-Steuerkopfzeilen, die Sie vom Ursprungsserver senden, was Ihrer ersten Anforderung entspricht.

Für Ihre zweite Anfrage, explizite Entwertung. Meine starke Empfehlung ist es, den Namen der URL der Ressource, die Sie für ungültig erklären möchten, entweder durch Umbenennen der Datei oder durch Verwendung einer Form von Abfragezeichenfolgen-Cache-Buster zu ändern. Varnish hat a PURGE Vorgang, der die Ressource aus dem Cache von Varnish entfernt, aber Sie nicht über andere Caches zwischen Ihnen und dem Benutzer steuern können. Wie Sie bereits erwähnt haben, möchten Sie eine Ressource explizit bereinigen, dann werden Ihnen Standard-HTTP-Steuerkopfzeilen nicht helfen. In diesen Fällen besteht der sicherste Weg, das Zwischenspeichern einer Ressource zu verhindern, darin, sie umzubenennen.


36
2018-06-24 02:43



Können Sie erklären, was Sie mit "Umbenennen der Datei oder Verwendung einer Form von Abfragezeichenfolge-Cache-Buster" meinen? Ich bin mir nicht sicher, ob ich verstehe, warum es keine gute Idee ist, eine Operation wie PURGE zu verwenden. - Continuation
+1 für Lack. Es ist immer viel besser, die richtigen Werkzeuge für den Job zu verwenden. - Tom O'Connor
@below: Es gibt fast keine Hoffnung, Lack in den Arenen der Leistung und Vielseitigkeit zu berühren. Dies wird von einem der führenden FreeBSD-Kernel-Entwickler und einem engagierten Team in Europa unterstützt. Varnish ist in Produktion bei Twitter, Heroku und vielen mehr. - Barry
Das einfachste Beispiel für einen Cache-Buster ist das Anhängen einer Versionsnummer in eine Abfragezeichenfolge an eine statische Ressource. Aus style.css wird also style.css? 123. Wenn Sie eine neue Version der Datei pushen möchten, ändern Sie die URL der Ressource in style.css 124 und jetzt werden die Caches sie als ein völlig neues Asset auffassen, das separat zwischengespeichert werden soll. Apache liefert die Datei style.css mit einer beliebigen angefügten Abfragezeichenfolge, sodass keine Änderungen an der eigentlichen Datei erforderlich sind. - chmac
Wenn möglich, ist es am besten, den Cache-Buster in den Dateinamen selbst zu stellen, wie z style.v123.css Da einige Caches keine Anforderungen mit einer Abfragezeichenfolge zwischenspeichern. - Noah McIlraith


Um ausgewählte Seiten ungültig zu machen, können Sie den "cache_purge" -Patch für nginx-0.8.x verwenden, was genau das ist, was Sie wollen;)

Es ist verfügbar Hier.


7
2017-11-17 07:38





Die meisten Caching-Tools (Citrix) ermöglichen ein Erzwingen der Aktualisierung (Strg + R), um eine zwischengespeicherte Seite neu zu fü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 in seiner Anfrage den Wert "max-age = 0" hat, wenn Sie in Ihrem Browser eine Strg + r-Anweisung ausführen. Ich weiß Chrome macht das, aber ich habe es nicht in anderen Browsern versucht. Das Hinzufügen weiterer Header-Felder kann einfach sein, indem einfach weitere if-Anweisungen hinzugefügt werden, die das festlegen $eac Variable auf 1.


6
2018-04-10 23:02





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


4
2018-06-24 02:25





Ich glaube NginxHttpProxyModule ist in der Lage, HTTP-Requests zu protokollieren. Suchen Sie nach den Anweisungen, die mit beginnen:

proxy_cache

Ja, es ist möglich, das Cache-Verhalten über Direktiven wie:

proxy_cache_valid

3
2018-06-24 10:12