HAProxy reqrep entferne URI auf Backend Anfrage

27

ganz schnelle Frage zu HAProxy reqrep. Ich versuche, die Anfrage, die an das Backend gesendet wird, umzuschreiben / zu ersetzen.

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

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

Ich möchte, dass web1 zu webfarm1 und web2 zu webfarm2 wechselt. Derzeit passiert dies. Ich möchte jedoch die Web1- oder Web2-URI entfernen, wenn die Anforderung an das Back-End 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 gehe http://domain/web1oder http://domain/web2es in den Fehlerprotokollen sehe, dass die Anforderung auf einem Server in jedem Backend, dass die Anforderung für die Ressource / web1 bzw. / web2 ist. Daher glaube ich, dass mit meinem regulären Ausdruck etwas 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 der URI weiterzuleiten. HAProxy soll jedoch die URI entfernen, wenn die Anforderung an den Back-End-Pool gesendet wird.

Vielen Dank!

-Jim

Jim
quelle
Es gibt jetzt eine Schaltfläche zum Bearbeiten und Kommentieren.
Chris S
1
Jim, Sie haben ein Problem beim Kommentieren, weil Sie mit einem anderen Konto als dem, mit dem Sie diese Frage erstellt haben, angemeldet sind. Bitte versuchen Sie, Ihr Login-Konto konsistent zu halten, damit dies in Zukunft nicht mehr passiert. Ich habe einen Moderator gemeldet, um das Problem zu beheben.
MDMarra

Antworten:

28

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 die / after webN weggelassen wird.

In Beantwortung Ihres Kommentars weiter unten ausführlicher darzulegen, wie die obigen Ausdrücke funktionieren, ist aufwändiger, als ich geben kann. Vielleicht hilft dies jedoch.

Alles vor / web1 "erfasst" alles, was in der Anforderungszeichenfolge vor web1 steht. Normalerweise wäre das also GET oder POST. Das (. *) "Erfasst" alles nach web1, auch nichts, wenn nichts vorhanden ist.

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

langer Hals
quelle
Was bedeutet \ 1 \ \ 2 \ 3? Was macht das ^ ([^ \] *) \ in Bezug auf die Reqrep-Dokumentation? Hier ist das Beispiel auf der Dokumentationsseite. # Ersetzen Sie "/ static /" am Anfang eines Anforderungspfads durch "/". reqrep ^ ([^ \] *) \ / static/(.*) \ 1 \ / \ 2
Jim
Nachdem ich Ihren Kommentar gelesen hatte, stellte ich fest, dass meine vorgeschlagene Lösung etwas zu kompliziert war. Ich habe es vereinfacht.
Longneck
Wie lautet also die Reqrep-Syntax? reqrep {string_2_search_thru} {search_string} {replace_string}? Ich bin verwirrt über die \ 1 \ \ 2 \ 3?
Jim,
Gibt es eine Möglichkeit, diese Anforderung in die Arbeit zu integrieren, wenn der Benutzer / web1 oder / web1 / eingibt?
Jim
Hast Du es versucht?
Longneck