HAProxy reqrep supprime l'URI sur demande de backend

27

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 différents pools de serveurs Web principaux.

http://domain/web1
http://domain/web2

Je veux que web1 passe 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 dans http://domain/web1ou http://domain/web2je 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 veux que HAProxy supprime l'URI lorsqu'il envoie la demande au pool principal.

Merci!

-Jim

Jim
la source
Il y a maintenant des boutons d'édition et de commentaire.
Chris S
1
Jim, vous rencontrez un problème pour commenter car vous êtes connecté avec un compte différent de celui utilisé pour créer cette question. Veuillez essayer de garder votre compte de connexion cohérent afin que cela ne se produise plus à l'avenir. J'ai signalé un modérateur pour résoudre ce problème.
MDMarra

Réponses:

28

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 quoi faire avec ces parties capturées. Il dit de former une chaîne composée de \1(la première partie capturée) et \2(suivie de la deuxième partie capturée). Puisque web1 n'est jamais capturé, il n'est pas assemblé dans la sortie finale.

long cou
la source
Que signifie le \ 1 \ \ 2 \ 3? En ce qui concerne la documentation de reqrep, que fait le ^ ([^ \] *) \? Voici l'exemple donné sur la page de documentation. # remplacez "/ statique /" par "/" au début de tout chemin de requête. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim
Après avoir lu votre commentaire, j'ai réalisé que ma solution proposée était légèrement trop compliquée. Je l'ai simplifié.
longneck
Alors, quelle est la syntaxe reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Je suis confus quant au \ 1 \ \ 2 \ 3?
Jim
Existe-t-il un moyen d'incorporer cette requête pour fonctionner si l'utilisateur met / web1 ou / web1 /?
Jim
L'avez-vous essayé?
longneck