Kann Varnish konfiguriert sein, einen zweiten Server für eine Ressource, um zu versuchen, wenn es ein 404 vom primären Server bekommt?

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

  •  29-09-2019
  •  | 
  •  

Frage

Dies wäre eine perfekte Lösung für mich sein, wie ich brauche etwas generierte Inhalte auf dem Web-Browser zu bedienen. Mein Plan ist es, die Inhalte auf Abruf und speichern sie für die nächste Zeit zu erzeugen. Ich will nicht der Browser meinen Dienst nennen (die den Inhalt erzeugt) jedes Mal. Ich mag, dass sie direkt an die „Cache“ Ressource gehen, wenn es verfügbar ist und nur den Service anrufen, wenn es nicht ist. Also würde ich Varinsh vor Server A gesetzt, die den Dienst und Server B ausgeführt wird, die die zuvor generierten Content-Versionen speichert. Wenn es eine Anforderung für eine Ressource bekommt es hat nicht zwischengespeichert es Server B. würde versuchen, eine 404-Antwort Bei bekommt es die gleiche Ressource von Server A beantragen werden.

Can Varnish mit VCL so konfiguriert werden? Wenn nicht, ist es eine Lösung, wie, dass Sie wissen?

P. S. Ich will nicht 302 Umleitungen an den Browser senden und ich habe keine Kontrolle über die Server-B, um es solche Umleitungen statt 404 schicken zu machen

War es hilfreich?

Lösung

Dies ist problemlos möglich, in Lack. Stellen Sie sicher, dass in vcl_fetch (und möglicherweise in vcl_error) können Sie den Rückgabestatuscode überprüfen (zB auf Status> 400), einen Neustart tun, wenn es nicht, und in vcl_recv wählen Sie das andere Backend wenn req.restarts> 0 Zum Beispiel:

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

Aber das wird gesagt, es klingt wie Sie das Konzept eines Cache-Server sind neu zu erfinden. Und Lack ist groß Cache-Server. Warum nicht ein Back-End-Server (serverA) und Varnish Cache Ihre generierten Einheiten haben? Sie können komplexe Regeln Setup und Sie werden Ablauf (des Cache), Purge-Management und Performance kostenlos bekommen! :)

Andere Tipps

In diesem Beispiel Lack try Fund in 6 Server, wenn nicht gefunden wird, zeigt die letzten 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);
   }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top