nginx usa la cache proxy se il backend è inattivo


11

Ho bisogno del proxy nginx utilizzare la cache se il server back-end è inattivo:

questa è la mia configurazione. ma sembra essere nginx utilizzare la cache senza controllare il server back-end.

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

La domanda è come posso bypassare la cache del proxy se il server back-end è attivo? E quando il server back-end è attivo, il mio server proxy non usa affatto la cache.


Qual è esattamente la domanda?
Jenny D

La domanda è come posso bypassare la cache del proxy se il server back-end è attivo?
giovedì

Una soluzione pronta per l' uso potrebbe essere quella di avere 2 "server" in esecuzione, uno con cache, uno senza cache e utilizzare il modulo upstream nginx.org/it/docs/http/ngx_http_upstream_module.html ? La soluzione migliore sarebbe probabilmente quella di essere in grado di utilizzare proxy_cache_bypass con un controllo se il backend è lì o no ... anche se non ho idea di come farlo funzionare ... caso interessante.
SvennD,

Le soluzioni a questa istanza di un problema XY possono essere trovate su SO
Dayo

Risposte:


8

Sembra un duplicato di questo:

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

In breve, utilizzare proxy_cache_use_stale

Come aggiornamento, ho provato questo e funziona benissimo. Ho fatto il test sulla mia workstation dove ho (per completezza):

Fedora 23 nginx 1.8.1 configurato come terminatore ssl + cache + reverse proxy Apache 2.4.18 configurato per l'ascolto alla porta 80

Con apache che agisce come upstream, serve solo un file statico ho fatto questo test:

  1. Apache su, nginx su, puntando il browser verso l'URL proxy inverso servito da nginx vedo il contenuto proxy da Apache. A questo punto nginx lo mantiene nella cache.
  2. Apache interrotto
  3. connettendomi a nginx vedo il file memorizzato nella cache come servito prima da Apache.

La configurazione di nginx che ho usato è (solo le parti interessanti):

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

Non funziona affatto provalo.
giovedì

Nel caso in cui dovresti segnalare un bug al team di nginx. Cosa hai provato a proposito? Nel caso in cui proverò a riprodurlo
Fredi,

Ok, ho fatto un test e ha funzionato bene. Aggiornato la mia risposta con i dettagli del test.
Fredi,

Quindi la mia lettura della domanda originale di Sweb era che, nello stato sia di Apache che di nginx, tutte le richieste dovevano passare al backend di Apache. Le richieste devono essere soddisfatte dalla cache di NginX se Apache non è attivo
abhishekmukherg

@abhishekmukherg, puoi fare quello che dici, ma perché? Quando entrambi sono attivi e i file sono statici (pensate a jpg / css / html) perché andare al backend usando più risorse di rete / cpu / ecc quando avete un vero frontend? A proposito, questa è un'altra questione
Fredi,

0

Utilizzare proxy_intercept_errors e proxy 500s su un server in cui è abilitata la memorizzazione nella cache.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.