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.