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/web1
oder http://domain/web2
es 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
Antworten:
Du hast das:
Ich denke du willst das:
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.quelle
Stellen Sie dies auf das Frontend
Gute Lektion zum Strippen lernen: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
quelle