nginx utilise le cache proxy si le backend est en panne

11

J'ai besoin que le proxy nginx utilise le cache si le serveur principal est en panne:

c'est ma configuration. mais semble être nginx utiliser le cache sans vérifier le serveur backend.

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 question est de savoir comment puis-je contourner le cache proxy si le serveur principal est en marche? Et lorsque le serveur principal est en marche, mon serveur proxy n'utilise pas du tout de cache.

sweb
la source
Quelle est exactement la question?
Jenny D
La question est de savoir comment puis-je contourner le cache proxy si le serveur principal est en marche?
sweb
Une solution prête à l' emploi pourrait être d'avoir 2 "serveurs" en cours d'exécution, un avec cache, un sans cache et d'utiliser le module en amont nginx.org/en/docs/http/ngx_http_upstream_module.html ? La meilleure solution serait probablement de pouvoir utiliser proxy_cache_bypass avec une vérification si le backend est là ou pas ... bien que je ne sache pas comment faire fonctionner ça ... cas intéressant.
SvennD
Des solutions à cette instance d'un problème XY peuvent être trouvées sur SO
Dayo

Réponses:

8

Semble un double de ceci:

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

En bref, utilisez proxy_cache_use_stale

En tant que mise à jour, j'ai testé cela et cela fonctionne très bien. J'ai fait le test sur mon poste de travail où j'ai (pour être complet):

Fedora 23 nginx 1.8.1 configuré comme terminateur ssl + cache + proxy inverse Apache 2.4.18 configuré pour écouter au port 80

Avec apache agissant en amont, servant juste un fichier statique, j'ai fait ce test:

  1. Apache up, nginx up, pointant le navigateur vers l'URL proxy inversée servie par nginx je vois le contenu proxy d'Apache. À ce stade, nginx conserve cela dans le cache.
  2. Apache arrêté
  3. en se connectant à nginx, je vois le fichier mis en cache tel que servi auparavant par Apache.

La configuration nginx que j'ai utilisée est (uniquement les parties intéressantes):

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
la source
Ne fonctionne pas du tout l'essayer.
sweb
Dans le cas où vous devriez signaler un bug à l'équipe nginx. Qu'avez-vous essayé btw? Au cas où j'essaierais de le reproduire
Fredi
Ok, j'ai fait un test et ça a bien fonctionné. Mis à jour ma réponse avec les détails du test.
Fredi
Donc, ma lecture de la question d'origine de sweb était que, dans l'état d'Apache et de nginx, toutes les demandes devraient être envoyées au backend Apache. Les demandes ne doivent être servies qu'à partir du cache NginX si Apache est en panne
abhishekmukherg
@abhishekmukherg, vous pouvez faire ce que vous dites, mais pourquoi? Quand les deux sont actifs et que les fichiers sont statiques (pensez jpg / css / html) pourquoi aller au backend en utilisant plus de ressources réseau / cpu / ecc quand vous avez un frontend réel? BTW, c'est une question pour une autre question
Fredi
0

Utilisez proxy_intercept_errors et proxy 500 pour un serveur sur lequel la mise en cache est activée.

chugadie
la source