it-swarm.com.de

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

Ich habe kürzlich gehört, dass Nginx seine 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, dann die generierten Seiten zwischenspeichern und nachfolgende Anforderungen für diese Seiten aus dem Cache bearbeiten.

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

  1. Legen Sie ein Ablaufdatum für das zwischengespeicherte Element fest
  2. Um das zwischengespeicherte Element 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 dafür einzustellen? Wie?

145
Continuation

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. 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 mithilfe von nginxs proxy_cache_bypass erzwingen. Weitere Informationen finden Sie unter Cherians Antwort .

In dieser Konfiguration werden Elemente, die nicht zwischengespeichert sind, aus example.net abgerufen und gespeichert. Die zwischengespeicherten Versionen werden zukünftigen Kunden zur Verfügung gestellt, bis sie nicht mehr gültig sind (60 Minuten).

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

Es gibt viele Parameter, die Sie optimieren können. Weitere Informationen hierzu 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;
    }
  }
}
97
Casey

Sie können speziell zwischengespeicherte Seiten durchblättern

proxy_cache_bypass       

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

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

Wenn Sie nun diese Seite ungültig machen und erneut zwischenspeichern möchten

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

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

Es wird ungültig und zwischengespeichert.

Funktioniert ab Nginx 0.7.

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

47
Cherian

Ich schlage vor, Sie geben Lack einen Versuch. Varnish wurde speziell als Reverse-Proxy-Cache entwickelt. Es werden alle Cache-Steuerungsheader berücksichtigt, die Sie vom Origin-Server senden, wodurch Ihre erste Anforderung erfüllt wird.

Für Ihre zweite Anfrage explizite Ungültigmachung. Ich empfehle dringend, den Namen der URL der Ressource, die Sie ungültig machen möchten, zu ändern, indem Sie die Datei umbenennen oder eine Art Abfragezeichenfolgen-Cache-Buster verwenden. Varnish verfügt über eine PURGE -Operation, mit der die Ressource aus dem Varnish-Cache entfernt wird. Sie haben jedoch keine Kontrolle über andere Caches zwischen Ihnen und dem Benutzer. Wie Sie bereits gesagt haben, möchten Sie eine Ressource explizit löschen, dann helfen Ihnen Standard-HTTP-Steuerelement-Header nicht weiter. In diesen Fällen besteht die narrensicherste Möglichkeit, das Caching einer Ressource zu verhindern, darin, sie umzubenennen.

36
Dave Cheney

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 verfügbar hier .

8
Piotr Sikora

Die meisten Caching-Tools (Citrix) ermöglichen eine Force-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 Anforderung max-age = 0 enthält, wenn Sie in Ihrem Browser Strg + r ausführen. Ich weiß, dass Chrome dies tut, aber ich habe es in anderen Browsern nicht versucht. Das Hinzufügen weiterer Headerfelder kann einfach sein, indem einfach weitere if-Anweisungen hinzugefügt werden, die das $eac Variable auf 1.

8
Randy Wallace

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

5
SaveTheRbtz

Ich glaube NginxHttpProxyModule ist in der Lage, http-Anfragen zu bearbeiten. Suchen Sie nach den Anweisungen, die beginnen mit:

proxy_cache

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

proxy_cache_valid
4
Taras Chuhay

Aufgrund der Tatsache, dass Sie keine Dokumente darauf finden können, wäre ich etwas vorsichtig, wenn ich mich in der Produktion darauf verlassen würde. Haben Sie über Lack nachgedacht? Es ist mein "Nginx of Reverse Proxies", klein, leicht, macht einen Job und macht es gut.

3
womble

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

2
Martin Murphy

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 - check out mein Blog-Beitrag ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • der Parameter inactive im proxy_cache_path Direktive:

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

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

Das Löschthema ist wirklich interessant, da diese Funktion nur in Nginx Plus (Nginx 'Commercial Edition) vorhanden ist. Ich mag @ randy-wallace Antwort wirklich. 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
    
  • entfernen Sie die Datei aus dem Dateisystem:

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

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

Syntax: proxy_cache zone | aus;

Standard: proxy_cache aus;

Kontext: http, Server, Standort

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

2
Tarik Huclaslun
 fastcgi_cache_path/opt/nginx-cache Ebenen = 2: 2 keys_zone = img: 50m; 
 
 location/img/{
 fastcgi_pass $ backend; 
 fcgi_params einschließen; 
 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 im/opt/nginx-Cache. Objekte werden 1 Minute lang zwischengespeichert.

Sie können anstelle von allen andere Antwortcodes schreiben.

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

0
lexsys

Es gibt ein Nginx-Plugin namens ncache , das behauptet, "ein Web-Cache-System zu sein, das auf einem Nginx-Webserver basiert. Schneller und effizienter als Squid".

0
sajal