Question HAProxy reqrep supprime l'URI de la requête principale


vraie question rapide concernant HAProxy reqrep. J'essaye de réécrire / remplacer la demande qui est envoyée au serveur.

J'ai l'exemple de domaine et les URI suivants, partageant 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 aille à backend webfarm1, et que web2 aille à webfarm2. Actuellement, cela se produit. Cependant, je souhaite supprimer l'URI web1 ou web2 lorsque la demande est envoyée au serveur.

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 des erreurs que la requête sur un serveur de chaque backend indique que la requête est pour la ressource / web1 ou / web2 respectivement. Par conséquent, j’estime qu’il ya un problème 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. Cependant, je souhaite qu'HAProxy supprime l'URI lorsqu'il envoie la demande au pool principal.

Je vous remercie!

-Jim


23
2017-11-02 23:20


origine


Il y a un boutons d'édition et de commentaire maintenant. - Chris S
Jim, vous rencontrez un problème pour commenter parce que vous êtes connecté avec un compte différent de celui utilisé pour créer cette question. Essayez de garder votre compte de connexion cohérent afin que cela ne se reproduise plus. J'ai signalé un modérateur pour résoudre ce problème. - MDMarra


Réponses:


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 / après WebN est omis.

En réponse à votre commentaire ci-dessous, entrer dans les détails sur le fonctionnement des expressions ci-dessus représente plus d'effort que je ne peux en donner. Cependant, cela aidera peut-être.

Tout ce qui se trouvait avant / web1 "capture" tout ce qui précède web1 dans la chaîne de requête. Donc, ce serait généralement GET ou POST. Le (. *) "Capture" tout ce qui suit Web1, y compris rien s'il n'y a rien.

La partie suivante (\1\2) dit quoi faire avec ces parties capturées. Il est 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). Web1 n'étant jamais capturé, il n'est pas assemblé dans la sortie finale.


23
2017-11-06 21:09



Que signifie le \ 1 \ \ 2 \ 3? En ce qui concerne la documentation reqrep, que fait ^ ([^ \] *) \? Voici l'exemple donné sur la page de documentation. # remplace "/ static /" par "/" au début de tout chemin de requête. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2 - Jim
Après avoir lu votre commentaire, je me suis rendu compte que ma solution proposée était un peu trop compliquée. Je l'ai simplifié. - longneck
Alors, quelle est la syntaxe reqrep? reqrep {string_2_search_thru} {chaîne_recherche} {chaîne_remplacer}? Je suis confus quant au \ 1 \ \ 2 \ 3? - Jim
Existe-t-il un moyen d’intégrer ce reqrep au travail si l’utilisateur met / web1 ou / web1 /? - Jim
Est-ce que tu l'as essayé? - longneck


Mettez ceci sur le frontend

reqirep  ^([^\ :]*)\ /(.*) \1\ /web1/\2

Bonne leçon apprendre à dénuder la ficelle: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5


0
2017-10-28 11:59