HAProxy wymaga usunięcia identyfikatora URI na żądanie zaplecza

27

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/web1lub http://domain/web2zobaczę 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

Jim
źródło
Teraz są przyciski edycji i komentowania.
Chris S
1
Jim, masz problem z komentowaniem, ponieważ jesteś zalogowany na inne konto niż kiedyś, gdy tworzyłeś to pytanie. Spróbuj zachować spójność konta logowania, aby nie stało się to w przyszłości. Oflagowałem moderatora, aby to naprawić.
MDMarra,

Odpowiedzi:

28

Masz to:

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

Myślę, że chcesz tego:

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

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.

długa szyja
źródło
Co oznacza \ 1 \ \ 2 \ 3? Co do dokumentacji reqrep, co robi ^ ([^ \] *) \? Oto przykład podany na stronie dokumentacji. # zamień „/ static /” na „/” na początku dowolnej ścieżki żądania. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim
Po przeczytaniu twojego komentarza zdałem sobie sprawę, że moje zaproponowane rozwiązanie było nieco zbyt skomplikowane. Uprościłem to.
longneck
Więc jaka jest składnia reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Jestem zdezorientowany co do \ 1 \ \ 2 \ 3?
Jim,
Czy istnieje sposób na włączenie tego żądania do działania, jeśli użytkownik umieści / web1 lub / web1 /?
Jim,
Próbowałeś?
longneck