Sélectionner une page

A Octopuce, on aime les bons outils libres, puissants, fiables, et ingénieux.

Varnish, le logiciel de serveur mandataire (proxy) pour gros sites web, fait partie de ces outils.

Récemment, nous avons dû, pour un client disposant de 4 serveurs web et d’un frontal sous Varnish, faire passer certaines pages sur un serveur web en particulier.

Jusque là, rien de bien compliqué. Nous avions défini nos serveurs web sous forme de backends dans la configuration de Varnish, et défini un répartiteur de charge, qui prenait les pages à servir :

backend web5 {
.host = "10.0.58.20"; .port = "80";
.probe = {
.request =
"GET / HTTP/1.1"
"Host: www.monsite.fr"
"Connection: close";
.timeout = 6s; .interval = 20s; .window = 8; .threshold = 3;
}
}
...

puis

director lb random {
.retries = 5;
{ .backend = web5; .weight = 7; }
{ .backend = web4; .weight = 7; }
{ .backend = web3; .weight = 7; }
...
}

Ensuite, dans vcl_recv, nous signifions que le backend par défaut était le load-balancer nommé « lb », et nous pouvions donner les cas particuliers, qui passeraient par exemple par le serveur web5 :

sub vcl_recv {
...
set req.backend=lb;
if (req.request == "GET" && req.url ~ "^\/files\/") {
set req.backend = web5;
}

Failover avec Varnish, howto …

Seul problème : si web5 plante, nous nous retrouvons à ne plus pouvoir servir les URL commençant par /files/.  Dans ce cas, il faut trouver une solution.

Comme nous n’aimons pas les SPOF (Single Point Of Failure, les endroits critiques dans les infrastructures web) nous avons, sur web4, une copie des données du /files/ de web5. Aussi, en cas de panne de web5, il faudrait passer en mode de secours sur web4.

Ce mode dit « de secours » (ou failover en anglais) peut être obtenu assez facilement avec Varnish grâce à sa directive restarts comme suit :

sub vcl_recv {
...
if (req.request == "GET" && req.url ~ "^\/files\/") {
set req.backend = web5;
if (req.restarts == 1 || !req.backend.healthy) {
set req.backend = web4;
}
}
}
sub vcl_fetch {
# Si un serveur est HS, on réessaye sur un autre backend :
if (obj.status != 200 && obj.status != 403 && obj.status != 404 &&
obj.status != 302 && obj.status != 304
) {
restart;
}
}

Rechargement de configuration de Varnish à chaud

et voilà. Il ne reste plus qu’à recharger la configuration de Varnish (à chaud s’il vous plaît !) et à la mettre en production :

varnishadm -T 127.0.0.1:6082 vcl.load prod20100114_2 /etc/varnish/default.vcl
varnishadm -T 127.0.0.1:6082 vcl.use prod20100114_2