it-swarm.com.de

HAProxy reqrep entfernt URI auf Backend-Anfrage

sehr schnelle Frage zu HAProxy reqrep. Ich versuche, die Anforderung, die an das Backend gesendet wird, neu zu schreiben/zu ersetzen.

Ich habe die folgenden Beispieldomänen und URIs, die beide denselben Domänennamen, aber unterschiedliche Backend-Webserverpools verwenden.

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

Ich möchte, dass web1 zu backend webfarm1 und web2 zu webfarm2 wechselt. Derzeit passiert dies. Ich möchte jedoch den Web1- oder Web2-URI entfernen, wenn die Anforderung an das Backend gesendet wird.

Hier ist meine 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

Wenn ich zu http://domain/web1 Oder http://domain/web2 Gehe, sehe ich in den Fehlerprotokollen, dass die Anforderung auf einem Server in jedem Backend, dass die Anforderung für die Ressource/web1 bzw./web2 gilt. Daher glaube ich, dass etwas mit meinem regulären Ausdruck nicht stimmt, obwohl ich ihn aus der Dokumentation kopiert und eingefügt habe. http://code.google.com/p/haproxy-docs/wiki/reqrep

Zusammenfassung: Ich versuche, Datenverkehr basierend auf URI weiterzuleiten. Ich möchte jedoch, dass HAProxy den URI entfernt, wenn die Anforderung an den Backend-Pool gesendet wird.

Vielen Dank!

-Jim

29
Jim

Du hast das:

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

Ich denke du willst das:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

Der Unterschied besteht darin, dass der zweite funktioniert, wenn das/nach webN weggelassen wird.

Als Antwort auf Ihren Kommentar unten ist es mehr Aufwand, detailliert darauf einzugehen, wie die obigen Ausdrücke funktionieren, als ich geben kann. Vielleicht hilft dies jedoch.

Alles vor/web1 "erfasst" alles, was vor web1 in der Anforderungszeichenfolge steht. Normalerweise wäre das also GET oder POST. Das (. *) "Erfasst" alles nach web1, einschließlich nichts, wenn es nichts gibt.

Der nächste Teil (\1\2) Sagt, was mit diesen erfassten Teilen zu tun ist. Es heißt, eine Zeichenfolge zu bilden, die aus \1 (Dem ersten erfassten Teil) und \2 (Gefolgt vom zweiten erfassten Teil) besteht. Da web1 nie erfasst wird, wird es nicht zur endgültigen Ausgabe zusammengefügt.

29
longneck

Stellen Sie dies auf das Frontend

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

Gute Lektion lernen, String zu entfernen: https://Gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5

0
Edwin Yulianto