2014-07-16 9 views
12

Ich versuche, ein Haproxy einzurichten, um Balance-Anforderungen auf ein paar Backends zu laden, die durch den uri-Pfad identifiziert werden. Zum Beispiel:Haproxy-Route und neu schreiben basierend auf URI-Pfad

https://www.example.com/v1/catalog/foo/bar

Sollte der "Katalog-v1" Backends führen.

Thing ist jede App reagiert auf einen anderen Pfad, so muss ich nicht nur die App identifizieren, sondern schreiben Sie den URL-Pfad. Z.B.

TO

Ich weiß, dass ich nicht HAProxy zum Umschreiben Zweck verwenden soll aber jetzt ist dies unvermeidlich.

Versucht, die folgende Regex, die auf regex101 gearbeitet:

([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) 

Substitution:

\1/\3-\2/\4 

Und schließlich ist hier die haproxy.config:

global 
    daemon 
    user root 
    group root 
    maxconn 256000 
    log  127.0.0.1 local0 
    log  127.0.0.1 local1 notice 
    stats socket /run/haproxy/stats.sock mode 777 level admin 
defaults 
    log  global 
    option dontlognull 
    maxconn 4000 
    retries 3 
    timeout connect 5s 
    timeout client 1m 
    timeout server 1m 
    option redispatch 
    balance roundrobin 

listen stats :8088 
    mode http 
    stats enable 
    stats uri /haproxy 
    stats refresh 5s 

backend catalog-v1 
    mode http 
    option httpchk GET /catalog-v1/ping 
    http-check expect status 200 
    reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4 
    server 127.0.0.1:8280_catalog-v1-node01 127.0.0.1:8280 check inter 2s rise 3 fall 2 

backend checkout-v1 
    mode http 
    option httpchk GET /checkout-v1/ping 
    http-check expect status 200 
    reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4 
    server 127.0.0.1:8180_checkout-v1-node01 127.0.0.1:8180 check inter 2s rise 3 fall 2 

frontend shared-frontend 
    mode http 
    bind localhost:80 
    acl is-catalog-v1-path path_dir /v1/catalog 
    acl is-checkout-v1-path path_dir /v1/checkout 
    use_backend catalog-v1 if is-catalog-v1-path 
    use_backend checkout-v1 if is-checkout-v1-path 

Bin ich etwas fehlt?

Ich habe damit seit einiger Zeit ohne Erfolg gekämpft. Die Backends zeigen "UP" auf der Haproxy-Statistik-Seite, aber jedes Mal, wenn ich die "nicht umgeschriebene URL" anrufe, erhalte ich einen 400 Bad Request-Fehler.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

9

Wenn ich Sie richtig verstehe, ersetzen Sie das folgende Beispiel:

reqrep ^([^\ ]\*)\ /([-.0-9A-Za-z]\*)/([a-zA-Z]\*)/(.\*) \1\ /\3-\2/\4 

http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#reqrep

reqrep search string [{if | unless} cond] 

Sie haben keine Räume.

+0

Arbeitete perfekt! Ich glaube, ich habe etwas vermisst. Vielen Dank! – leovrf

+0

Ich habe mit einem ähnlichen gekämpft. Im Grunde möchte ich die URL example.com/test/app/v1/foo/bar-> otherexample.com/v1/app/foo/bar umleiten. Ich habe versucht, die Regex 'reqrep^([^ \] *) \/([a-zA-Z] \ *)/([a-zA-Z] \ *)/([0-9A- Za-z] \ *)/(. *) \ 1 \/\ 4/\ 3/\ 5' mit der Serverkonfiguration als 'Servername otherexample.com check maxqueue 200 weight 100' – user320550

1

Die obige Antwort ist ein einzelnes Update, das die Ursache des Problems nicht erläutert. Das Problem ist, dass viele davon ausgehen, dass wir eine vollständige URL analysieren oder nur die PATH-Komponente, wenn wir HTTP-Header tatsächlich analysieren/umschreiben.

Zum Beispiel:

curl -iv https://stackoverflow.com/questions/24784517/haproxy-route-and-rewrite-based-on-uri-path 
* Trying 151.101.65.69... 
> GET /questions/24784517/haproxy-route-and-rewrite-based-on-uri-path HTTP/1.1 
> Host: stackoverflow.com 
> User-Agent: curl/7.54.0 
> Accept: */* 

Ziel ist es, neu zu schreiben GET /some_path HTTP/1.1-GET /some_other_path HTTP/1.1

ich klarstellen möchte, dass die Lösung oben funktioniert, weil es berücksichtigt die HTTP-Verb im Spiel und ersetzen. ^([^\ ]\*)\ (.*), um das Verb zu erfassen und im Ersatzmuster zu verwenden. \1 \2