nginx verwendet den Proxy-Cache, wenn das Backend nicht verfügbar ist

11

Ich muss Nginx-Proxy verwenden Cache, wenn Backend-Server ausfällt:

Das ist meine Konfiguration. aber scheint nginx Cache zu verwenden, ohne Backend-Server zu überprüfen.

http {

  # ...

  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_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

Die Frage ist, wie kann ich den Proxy-Cache umgehen, wenn der Back-End-Server aktiv ist? Und wenn der Backend-Server aktiv ist, verwendet mein Proxyserver überhaupt keinen Cache.

sweb
quelle
Was genau ist die Frage?
Jenny D
Die Frage ist, wie kann ich den Proxy-Cache umgehen, wenn der Back-End-Server aktiv ist?
Sweb
Eine Standardlösung könnte darin bestehen, zwei "Server" auszuführen, einen mit Cache und einen ohne Cache, und das Upstream-Modul nginx.org/en/docs/http/ngx_http_upstream_module.html zu verwenden . Die beste Lösung wäre wahrscheinlich, proxy_cache_bypass mit einer Überprüfung zu verwenden, ob das Backend vorhanden ist oder nicht ... obwohl ich keine Ahnung habe, wie ich das zum Laufen bringen kann ... interessanter Fall.
SvennD
Lösungen für diese Instanz eines XY-Problems finden Sie am SO
Dayo

Antworten:

8

Scheint ein Duplikat davon:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

Kurz gesagt, verwenden Sie proxy_cache_use_stale

Als Update habe ich dies getestet und es funktioniert gut. Ich habe den Test auf meiner Workstation durchgeführt, auf der ich (der Vollständigkeit halber):

Fedora 23 nginx 1.8.1 konfiguriert als SSL-Terminator + Cache + Reverse Proxy Apache 2.4.18 konfiguriert für das Abhören an Port 80

Mit Apache als Upstream, der nur eine statische Datei bereitstellt, habe ich diesen Test durchgeführt:

  1. Apache up, nginx up, zeigt den Browser auf die Reverse-Proxy-URL, die von Nginx bereitgestellt wird. Ich sehe den Proxy-Inhalt von Apache. Zu diesem Zeitpunkt behält Nginx dies im Cache.
  2. Apache gestoppt
  3. Verbindung zu Nginx Ich sehe die zwischengespeicherte Datei, wie sie zuvor von Apache bereitgestellt wurde.

Die von mir verwendete Nginx-Konfiguration ist (nur die interessanten Teile):

nginx.conf:

http {
[...]
location
    proxy_cache_path        /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/local.conf:

upstream localhost {
    server 127.0.0.1:80;
[...]
}


server {
    listen       127.0.0.1:443 ssl;

[...]

    location /be/ {
        proxy_pass              http://localhost;
        proxy_cache             STATIC;
        proxy_cache_valid       200 1d;
        proxy_cache_use_stale   error;
}
Fredi
quelle
Überhaupt nicht funktionieren, probieren Sie es aus.
Sweb
Falls Sie dem Nginx-Team einen Fehler melden sollten. Was hast du übrigens versucht? Für den Fall, dass ich versuchen werde, es zu reproduzieren
Fredi
Ok, ich habe einen Test gemacht und es hat gut funktioniert. Meine Antwort wurde mit den Testdetails aktualisiert.
Fredi
Meine Lektüre von Swebs ursprünglicher Frage war also, dass im Zustand von Apache und Nginx alle Anfragen an das Apache-Backend weitergeleitet werden sollten. Anfragen sollten nur aus dem NginX-Cache bearbeitet werden, wenn Apache nicht verfügbar ist
abhishekmukherg
@abhishekmukherg, du kannst machen was du sagst, aber warum? Wenn beide aktiv sind und die Dateien statisch sind (denken Sie an jpg / css / html), warum sollten Sie mit mehr Netzwerk- / CPU- / ecc-Ressourcen zum Backend gehen, wenn Sie ein tatsächliches Frontend haben? Übrigens ist dies eine Frage für eine andere Frage
Fredi
0

Verwenden Sie proxy_intercept_errors und proxy 500s für einen Server, für den das Caching aktiviert ist.

Chugadie
quelle