Frage HAProxy reqrep entfernt den URI der Backend-Anfrage


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

Ich habe die folgenden Beispiel-Domäne und URIs, die beide den gleichen Domänennamen teilen, aber verschiedene Back-End-Webserver-Pools.

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

Ich möchte, dass Web1 zum Backend webfarm1 und Web2 zum Webfarm2 geht. Momentan passiert das. Ich möchte jedoch den 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/web1 oder http://domain/web2 Ich sehe es in den Fehlerprotokollen, dass die Anfrage auf einem Server in jedem Backend, dass die Anfrage für die Ressource / Web1 bzw. / Web2 ist. Daher glaube ich, dass etwas mit meinem regulären Ausdruck nicht in Ordnung ist, obwohl ich es aus der Dokumentation kopiert und eingefügt habe. http://code.google.com/p/haproxy-docs/wiki/reqrep

Zusammenfassung: Ich versuche, Verkehr basierend auf URI zu leiten, jedoch möchte ich, dass HAProxy den URI entfernt, wenn er die Anforderung an den Back-End-Pool sendet.

Vielen Dank!

-Jim


23
2017-11-02 23:20


Ursprung


Es gibt jetzt eine Editier- und Kommentarschaltfläche. - Chris S
Jim, Sie haben ein Problem beim Kommentieren, weil Sie mit einem anderen Konto angemeldet sind als Sie zum Erstellen dieser Frage verwendet haben. Bitte versuchen Sie, Ihren Login-Account konsistent zu halten, damit dies in Zukunft nicht mehr geschieht. Ich habe einen Moderator markiert, um das zu beheben. - MDMarra


Antworten:


Du hast das:

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

Ich denke du willst das:

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

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

Als Antwort auf Ihren Kommentar unten gehen Sie ausführlich darauf ein, wie die obigen Ausdrücke arbeiten, ist mehr Aufwand, als ich geben kann. Vielleicht wird dies jedoch helfen.

Alles vor / web1 "erfasst" alles, was vor web1 in der Anforderungszeichenfolge steht. Also normalerweise wäre das GET oder POST. Die (. *) "Fängt" alles nach web1 ein, einschließlich nichts, wenn es nichts gibt.

Der nächste Teil (\1\2) sagt, was mit diesen gefangenen Teilen zu tun ist. Es sagt, um eine Schnur zu bilden, die besteht aus \1 (der erste erfasste Teil) und \2 (gefolgt von dem zweiten gefangenen Teil). Da web1 niemals erfasst wird, wird es nicht in die endgültige Ausgabe eingefügt.


23
2017-11-06 21:09



Was bedeutet das \ 1 \ \ 2 \ 3? Bezüglich der reqrep-Dokumentation: Was macht das ^ ([^ \] *)? Hier ist das Beispiel auf der Dokumentationsseite. # Ersetzen Sie "/ static /" durch "/" am Anfang eines beliebigen Anfragepfads. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2 - Jim
Nachdem ich Ihren Kommentar gelesen hatte, wurde mir klar, dass meine vorgeschlagene Lösung leicht übermäßig kompliziert war. Ich habe es vereinfacht. - longneck
Was ist die reqrep-Syntax? reqrep {string_2_search_thru} {suchschnur} {replace_string}? Ich bin verwirrt bezüglich der \ 1 \ \ 2 \ 3? - Jim
Gibt es eine Möglichkeit, dieses reqrep zu integrieren, wenn der Benutzer / web1 oder / web1 /? - Jim
Hast Du es versucht? - longneck


Setzen Sie dies auf das Frontend

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

Gute Lektion zum Strippen lernen: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5


0
2017-10-28 11:59