vraie question rapide concernant HAProxy reqrep. J'essaie de réécrire/remplacer la demande qui est envoyée au backend.
J'ai l'exemple de domaine et les URI suivants, partageant tous les deux le même nom de domaine, mais des pools de serveurs Web principaux différents.
http://domain/web1
http://domain/web2
Je veux que web1 accède au backend webfarm1 et web2 à webfarm2. Actuellement, cela se produit. Cependant, je souhaite supprimer l'URI web1 ou web2 lorsque la demande est envoyée au backend.
Voici mon haproxy.cfg
frontend webVIP_80
mode http
bind :80
#acl routing to backend
acl web1_path path_beg /web1
acl web2_path path_beg /web2
#which backend
use_backend webfarm1 if web1_path
use_backend webfarm2 if web2_path
default_backend webfarm1
backend webfarm1
mode http
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
balance roundrobin
option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
mode http
reqrep ^([^\ ]*)\ /web2/(.*) \1\ /\2
balance roundrobin
option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms
Si je vais à http://domain/web1
ou http://domain/web2
Je vois dans les journaux d'erreurs que la demande sur un serveur dans chaque backend que le requst est pour la ressource/web1 ou/web2 respectivement. Par conséquent, je crois qu'il y a quelque chose de mal avec mon expression régulière, même si je l'ai copiée et collée à partir de la documentation. http://code.google.com/p/haproxy-docs/wiki/reqrep
Résumé: J'essaie d'acheminer le trafic en fonction de l'URI, mais je souhaite que HAProxy supprime l'URI lorsqu'il envoie la demande au pool principal.
Je vous remercie!
-Jim
Tu as ceci:
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
Je pense que tu veux ça:
reqrep ^([^\ ]*\ /)web1[/]?(.*) \1\2
La différence étant que le second fonctionnera si le /N webN est omis.
En réponse à votre commentaire ci-dessous, entrer dans les détails sur la façon dont les expressions ci-dessus fonctionnent représente plus d'efforts que je ne peux en donner. Cependant, cela peut peut-être aider.
Tout ce qui précède/web1 "capture" tout ce qui précède web1 dans la chaîne de requête. Donc, généralement, ce serait GET ou POST. Le (. *) "Capture" tout après web1, y compris rien s'il n'y a rien.
La partie suivante (\1\2
) indique que faire des parties capturées. Il dit de former une chaîne composée de \1
(la première partie capturée) et \2
(suivi de la deuxième partie capturée). Puisque web1 n'est jamais capturé, il n'est pas assemblé dans la sortie finale.
Mettez cela sur le frontend
reqirep ^([^\ :]*)\ /(.*) \1\ /web1/\2
Bonne leçon apprendre à dépouiller la chaîne: https://Gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5