web-dev-qa-db-fra.com

HAProxy reqrep supprime l'URI sur demande de backend

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

29
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.

29
longneck

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

0
Edwin Yulianto