nginx używa pamięci podręcznej proxy, jeśli backend jest wyłączony

11

Potrzebuję nginx proxy użyć pamięci podręcznej, jeśli serwer zaplecza nie działa:

to moja konfiguracja. ale wygląda na to, że nginx używa pamięci podręcznej bez sprawdzania serwera zaplecza.

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

Pytanie brzmi, jak mogę ominąć pamięć podręczną proxy, jeśli serwer zaplecza jest uruchomiony? A kiedy serwer zaplecza jest włączony, mój serwer proxy w ogóle nie używa pamięci podręcznej.

sweb
źródło
Jakie jest dokładnie pytanie?
Jenny D
Pytanie brzmi, jak mogę ominąć pamięć podręczną proxy, jeśli serwer zaplecza jest uruchomiony?
sweb
Jednym z gotowych rozwiązań może być uruchomienie 2 „serwerów”, jednego z pamięcią podręczną, jednego bez pamięci podręcznej i użycia modułu nadrzędnego nginx.org/en/docs/http/ngx_http_upstream_module.html ? Najlepszym rozwiązaniem byłoby prawdopodobnie użycie proxy_cache_bypass ze sprawdzeniem, czy backend tam jest, czy nie ... chociaż nie mam pojęcia, jak uzyskać ten działający ... interesujący przypadek.
SvennD,
Rozwiązania tego problemu XY można znaleźć w SO
Dayo

Odpowiedzi:

8

Wydaje się duplikatem tego:

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

W skrócie, użyj proxy_cache_use_stale

Jako aktualizację przetestowałem to i działa dobrze. Zrobiłem test na mojej stacji roboczej, gdzie mam (dla kompletności):

Fedora 23 nginx 1.8.1 skonfigurowana jako terminator ssl + pamięć podręczna + zwrotny serwer proxy Apache 2.4.18 skonfigurowany do nasłuchiwania na porcie 80

Z apache działającym jako upstream, obsługującym tylko plik statyczny, zrobiłem ten test:

  1. Apache w górę, nginx w górę, wskazując przeglądarce odwrotny serwer proxy obsługiwany przez nginx. Widzę zawartość serwera proxy z Apache. W tym momencie nginx utrzymuje to w pamięci podręcznej.
  2. Zatrzymano apache
  3. łącząc się z nginx, widzę buforowany plik podany wcześniej przez Apache.

Użyłem konfiguracji nginx (tylko ciekawe części):

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
źródło
W ogóle nie działa spróbuj.
sweb
W przypadku, gdy powinieneś zgłosić błąd zespołowi nginx. Czego próbowałeś? Na wypadek, gdyby spróbowałem go odtworzyć
Fredi
Ok, zrobiłem test i działało dobrze. Zaktualizowałem moją odpowiedź o szczegóły testu.
Fredi
Więc moje czytanie oryginalnego pytania SWeb było takie, że zarówno w stanie Apache, jak i nginx, wszystkie żądania powinny przechodzić do backendu Apache. Żądania powinny być obsługiwane tylko z pamięci podręcznej NginX, jeśli nie działa Apache
abhishekmukherg
@abhishekmukherg, możesz robić, co mówisz, ale dlaczego? Kiedy oba są uruchomione, a pliki są nieruchome (pomyśl jpg / css / html), po co chodzić do backendu przy użyciu większej ilości zasobów sieciowych / cpu / ecc, gdy masz rzeczywistą nakładkę? BTW, to kwestia innego pytania
Fredi
0

Użyj proxy_intercept_errors i proxy 500 do serwera z włączonym buforowaniem.

chugadie
źródło