2 votes

HAProxy/Varnish : rediriger un pourcentage du trafic

J'essaie de mesurer des statistiques distinctes pour deux versions différentes d'une page Web. J'ai donc besoin de rediriger un certain pourcentage de mon trafic web vers une page différente de celle demandée (c'est-à-dire que 20 % des demandes pour la page_1 vont vers la page_1.1).
Il ne me semble pas que Varnish puisse nativement compter le trafic ou les requêtes.
Je pense que je pourrais faire en sorte que le backend Apache compte les requêtes, insère un en-tête personnalisé, puis que Varnish envoie un redémarrage au client si la réponse du backend contient cet en-tête.

Des idées ou des suggestions ?

A la vôtre,
Jeremy

EDIT : J'ai oublié de mentionner qu'il y a une istance HAProxy devant Varnish, donc je pensais qu'une autre bonne façon de faire pourrait être :

Sur HAProxy :
nombre de demandes pour la page1
si le compte > 80 insérer l'en-tête personnalisé
si le compte = 100 remettre le compteur à zéro

Sur le vernis
si l'en-tête personnalisé est présent dans la requête, le client redémarre avec une réécriture page1->page1.1

Je ne sais pas comment faire avec ACL, gpc0 et stick-tables. J'étudie pour trouver une solution :-)

Comme toujours, les idées et les suggestions sont les bienvenues.

1voto

Rob Points 994

Je n'ai jamais eu à configurer un serveur Varnish mais j'imagine que c'est possible en utilisant la fonction équilibreur de charge intégré avec une configuration round-robin.

Par exemple, si vous avez configuré 4 backend pointant vers l'ancienne version de votre site/page et 1 vers la nouvelle version, comme ceci .

backend old1 {
  .host = "old.example.com";
  .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; }
}
backend old2 {
  .host = "old.example.com";
  .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; }
}
backend old3 {
  .host = "old.example.com";
  .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; }
}
backend old4 {
  .host = "old.example.com";
  .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; }
}
backend new {
  .host = "new.example.com";
  .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; }
}

Et il y a eu un directeur qui a fait des rondes entre eux...

director blah round-robin {
  { .backend = old1; }
  { .backend = old2; }
  { .backend = old3; }
  { .backend = old4; }
  { .backend = new; }
}

La version du site new.example.com recevrait 20 % du trafic.

Il s'agit d'un peu de bricolage (il existe peut-être une meilleure solution), mais je pense que cela peut fonctionner.

0 votes

Bonjour @Molomby, merci pour la suggestion. Il me semble que cela pourrait fonctionner. Je pourrais alors émettre un redémarrage du client avec une réécriture de l'url pour la page de test pour les demandes acheminées vers le backend new.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X