Peut-Varnish être configuré pour essayer un second serveur pour une ressource si elle obtient un 404 du serveur principal?

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

  •  29-09-2019
  •  | 
  •  

Question

Ce serait une solution parfaite pour moi que je dois servir un contenu généré par les navigateurs Web. Mon plan est de générer le contenu de la demande et la stocker pour la prochaine fois. Je ne veux pas que les navigateurs pour appeler mon service (qui génère le contenu) à chaque fois. Je veux qu'ils aillent directement à la ressource « en cache » si elle est disponible et seulement appeler le service si ce n'est pas. Donc, je mettrais Varinsh devant le serveur A qui exécute le service et le serveur B qui stocke les versions de contenu généré précédemment. Si elle obtient une demande d'une ressource, il n'a pas encore mis en cache, il va essayer le serveur B. En obtenant une réponse 404, il va demander la même ressource du serveur A.

peut Varnish être configuré de telle manière avec VCL? Dans le cas contraire est-il une solution comme celle que vous connaissez?

P.S. Je ne veux pas envoyer 302 redirige vers le navigateur plus je n'ai pas de contrôle sur le serveur B pour le faire envoyer ces réoriente au lieu de 404 de

Était-ce utile?

La solution

Ceci est parfaitement possible Varnish. Assurez-vous que dans vcl_fetch (et éventuellement en vcl_error) vous vérifiez le code d'état de retour (par exemple, vérifier l'état> 400), un redémarrage si elle a échoué, et vcl_recv sélectionnez l'autre backend si req.restarts> 0. Par exemple:

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

Mais cela étant dit, il semble que vous êtes réinvente le concept d'un serveur de cache. Et est Varnish grand serveur de cache. Pourquoi ne pas avoir un serveur back-end (serverA) et ont Varnish cache vos entités générées? Vous pouvez configurer des règles complexes et vous aurez l'expiration (du cache), la gestion de la purge et la performance gratuitement! :)

Autres conseils

Dans cet exemple, le vernis essayer trouver dans 6 serveurs, sinon trouvé, montre le dernier 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);
   }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top