Vernice può essere configurato per cercare un secondo server per qualche risorsa se si ottiene un 404 dal server primario?

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

  •  29-09-2019
  •  | 
  •  

Domanda

Questa sarebbe una soluzione perfetta per me, come ho bisogno di servire alcuni contenuti generati ai browser web. Il mio piano è quello di generare il contenuto di domanda e conservarla per la prossima volta. Non voglio i browser di chiamare il mio servizio (che genera i contenuti) ogni volta. Voglio loro di andare direttamente alla risorsa "cache" se è disponibile e solo chiamare il servizio se non lo è. Così avevo messo Varinsh davanti server A che gestisce il servizio e il server B che memorizza le versioni del contenuto generate in precedenza. Se si riceve una richiesta per una risorsa che non ha cache si cercherà di server B. Su ottenere una risposta 404 che sarà richiesta la stessa risorsa dal server A.

una vernice essere configurato in modo tale con VCL? Se non c'è una soluzione del genere sai di?

P.S. Non voglio inviare 302 redirect al browser più non avere il controllo su server B per renderlo inviare tali redirect al posto dei 404 di

È stato utile?

Soluzione

Questo è perfettamente possibile in vernice. Assicurarsi che in vcl_fetch (e possibilmente in vcl_error) di controllare il codice di stato di ritorno (ad esempio, verificare la presenza di stato di> 400), fare un riavvio se non è riuscito, e in vcl_recv selezionare l'altra backend se req.restarts> 0. Ad esempio:

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

Ma questo detto, suona come si sta reinventando il concetto di un cache server. E vernice è grande cache server. Perché non avere un server back-end (serverA) e hanno unghie cache le entità generate? È possibile impostare regole complesse e si otterrà la scadenza (della cache), la gestione di spurgo e prestazioni gratis! :)

Altri suggerimenti

In questo esempio, la vernice prova scoperta a 6 server, se non trovati, mostra l'ultimo 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);
   }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top