El barniz puede ser configurado para intentar un segundo servidor para algún recurso si se consigue un 404 desde el servidor primario?

StackOverflow https://stackoverflow.com/questions/4327874

  •  29-09-2019
  •  | 
  •  

Pregunta

Esta sería una solución perfecta para mí, ya que necesito para servir algún contenido generado para los navegadores web. Mi plan es generar el contenido de la demanda y almacenarla para la próxima vez. No quiero que los navegadores para llamar a mi servicio (que genera el contenido) cada vez. Quiero que van directamente al recurso "caché" si está disponible y sólo llamar al servicio si no lo es. Así que me gustaría poner Varinsh frente a un servidor que ejecuta el servicio y el servidor B que almacena las versiones de contenidos generados anteriormente. Si se hace una petición de un recurso que no tiene en caché se va a tratar el servidor B. Tras obtener una respuesta 404 que va a solicitar el mismo recurso del servidor A.

Can barniz puede configurar de tal manera con VCL? Si no hay una solución como la que usted sabe acerca?

P.S. No quiero enviar 302 vuelve a dirigir al navegador además de que no tiene control sobre el servidor B para hacer que envíe tales redirecciones en lugar de de 404

¿Fue útil?

Solución

Esto es perfectamente posible en barniz. Asegúrese de que en vcl_fetch (y posiblemente en vcl_error) que comprueba el código de estado de retorno (por ejemplo, para comprobar el estado de> 400), realice un reinicio si falló, y en vcl_recv seleccionar el otro backend si req.restarts> 0. Por ejemplo:

backend serverA {
   .host="192.168.0.1";
   .port = "80";
}

backend serverB {
   .host = "192.168.0.2";
   .port = "80";
}

sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverB;
   } else {
       set req.backend = serverA;
   }
}

sub vcl_fetch {
    if (obj.status >= 400 && req.restarts == 0) {
        restart;
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       restart;
   }
}

Pero esto se dice, suena como que está reinventando el concepto de un servidor caché. Y El barniz es un gran servidor de caché. Por qué no tener un servidor back-end (servidorA) y tienen caché de sus entidades generadas barniz? Puede complejas reglas de configuración y obtendrá de caducidad (de la caché), la gestión y el rendimiento de purga de forma gratuita! :)

Otros consejos

En este ejemplo, el barniz intento hallazgo en 6 servidores, si no se encuentra, mostrar el último msg.

# cat /etc/varnish/default.vcl 
backend serverA {
   .host="10.42.4.104";
   .port = "80";
}

backend serverB {
   .host = "10.42.4.102";
   .port = "80";
}

backend serverC {
   .host = "10.42.4.103";
   .port = "80";
}

backend serverD {
   .host = "10.42.4.101";
   .port = "80";
}

backend serverE {
   .host = "10.42.4.105";
   .port = "80";
}

backend serverF {
   .host = "10.42.4.106";
   .port = "80";
}




sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverA;
   } elseif (req.restarts == 1){
       set req.backend = serverB;
   } elseif (req.restarts == 2){
       set req.backend = serverC;
   } elseif (req.restarts == 3){
       set req.backend = serverD;
   } elseif (req.restarts == 4){
       set req.backend = serverE;
   } else {
       set req.backend = serverF;
   }
}


sub vcl_fetch {
    if (beresp.status >= 400 && req.restarts == 0) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 1) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 2) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 3) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 4) {
        return(restart);
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       return(restart);
   }
   if (req.restarts == 1) {
       return(restart);
   }
   if (req.restarts == 2) {
       return(restart);
   }
   if (req.restarts == 3) {
       return(restart);
   }
   if (req.restarts == 4) {
       return(restart);
   }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top