nginx usa caché proxy si el backend está inactivo


11

Necesito que el proxy nginx use caché si el servidor de fondo está inactivo:

Esta es mi configuración. pero parece que nginx usa caché sin verificar el servidor de fondo.

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 pregunta es ¿cómo puedo omitir el caché de proxy si el servidor de fondo está activo? Y cuando el servidor de fondo está activo, mi servidor proxy no usa caché en absoluto.


Cuál es exactamente la pregunta?
Jenny D

La pregunta es ¿cómo puedo omitir el caché de proxy si el servidor de fondo está activo?
Sweb

Una solución lista para usar podría ser tener 2 "servidores" en ejecución, uno con caché, otro sin caché y usar el módulo ascendente nginx.org/en/docs/http/ngx_http_upstream_module.html ? La mejor solución probablemente sería poder usar proxy_cache_bypass con un cheque si el backend está ahí o no ... aunque no tengo idea de cómo hacer que funcione ... caso interesante.
SvennD

Las soluciones para esta instancia de un problema XY se pueden encontrar en SO
Dayo

Respuestas:


8

Parece un duplicado de esto:

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

En resumen, use proxy_cache_use_stale

Como actualización, probé esto y funciona bien. Hice la prueba en mi estación de trabajo donde tengo (para completar):

Fedora 23 nginx 1.8.1 configurado como terminador ssl + caché + proxy inverso Apache 2.4.18 configurado para escuchar en el puerto 80

Con Apache actuando como ascendente, sirviendo solo un archivo estático, hice esta prueba:

  1. Apache arriba, nginx arriba, apuntando el navegador a la URL proxy inversa servida por nginx veo el contenido proxy de Apache. En este punto, nginx mantiene esto en caché.
  2. Apache detenido
  3. al conectarme a nginx, veo el archivo en caché tal como lo sirvió Apache anteriormente.

La configuración de nginx que utilicé es (solo las partes interesantes):

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

No funciona en absoluto, pruébalo.
Sweb

En caso de que deba informar un error al equipo nginx. ¿Qué probaste por cierto? En caso de que intente reproducirlo
Fredi

Ok, hice una prueba y funcionó bien. Actualicé mi respuesta con los detalles de la prueba.
Fredi

Entonces, mi lectura de la pregunta original de sweb fue que, en el estado de Apache y nginx up, todas las solicitudes deberían pasar al backend de Apache. Las solicitudes solo deben ser atendidas desde el caché NginX si Apache está inactivo
abhishekmukherg

@abhishekmukherg, puedes hacer lo que dices, pero ¿por qué? Cuando ambos están activos y los archivos están estáticos (piense en jpg / css / html), ¿por qué ir al back-end usando más recursos de red / cpu / ecc cuando tiene una interfaz real? Por cierto, este es un tema para otra pregunta
Fredi

0

Use proxy_intercept_errors y proxy 500s para un servidor que tenga habilitado el almacenamiento en caché.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.