naprawdę szybkie pytanie dotyczące wymagania HAProxy. Próbuję przepisać / zastąpić żądanie, które zostanie wysłane do wewnętrznej bazy danych.
Mam następującą przykładową domenę i identyfikatory URI, oba o tej samej nazwie domeny, ale różnych pulach serwerów WWW zaplecza.
http://domain/web1
http://domain/web2
Chcę web1, aby przejść do zaplecza webfarm1, a web2, aby przejść do webfarm2. Obecnie tak się dzieje. Jednak chcę usunąć identyfikator URI web1 lub web2, gdy żądanie zostanie wysłane do wewnętrznej bazy danych.
Oto mój 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
Jeśli przejdę do http://domain/web1
lub http://domain/web2
zobaczę to w dzienniku błędów, że żądanie na serwerze w każdym zapleczu, że żądanie jest odpowiednio dla zasobu / web1 lub / web2. Dlatego uważam, że coś jest nie tak z moim wyrażeniem regularnym, mimo że skopiowałem go i wkleiłem z Dokumentacji. http://code.google.com/p/haproxy-docs/wiki/reqrep
Podsumowanie: Próbuję kierować ruchem na podstawie identyfikatora URI, jednak chcę, aby HAProxy usunął identyfikator URI, gdy wysyła żądanie do puli zaplecza.
Dziękuję Ci!
-Jim
Odpowiedzi:
Masz to:
Myślę, że chcesz tego:
Różnica polega na tym, że drugi będzie działał, jeśli pominięto webN po /.
W odpowiedzi na twój komentarz poniżej, szczegółowe omówienie działania powyższych wyrażeń jest większym wysiłkiem, niż mogę dać. Może to jednak pomoże.
Wszystko przed / web1 „przechwytuje” wszystko, co występuje przed web1 w ciągu żądania. Zwykle byłoby to GET lub POST. (. *) „Przechwytuje” wszystko po web1, w tym nic, jeśli nie ma nic.
Następna część (
\1\2
) mówi, co zrobić z tymi przechwyconymi częściami. Mówi, aby utworzyć ciąg złożony z\1
(pierwszej przechwyconej części) i\2
(po której następuje druga przechwycona część). Ponieważ web1 nigdy nie jest przechwytywany, nie jest on montowany w końcowym wyniku.źródło
Umieść to na froncie
Dobra lekcja naucz się usuwać ciąg: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
źródło