HAProxy reqrep видалити URI на запит бекенда


27

справжнє швидке запитання щодо HAProxy reqrep. Я намагаюся переписати / замінити запит, який надсилається до бекенда.

У мене є наступний приклад домену та URI, обидва мають одне і те ж ім’я домену, але різні пули сервера веб-сервера.

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

Я хочу, щоб web1 перейшов до бекенда webfarm1, а web2 - до webfarm2. В даний час це відбувається. Однак я хочу позбавити URI web1 або web2, коли запит буде надіслано в бекенд.

Ось мій 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

Якщо я переходжу http://domain/web1або http://domain/web2бачу це в журналах помилок, що запит на сервері в кожному бекенді, що запит призначений для ресурсу / web1 або / web2 відповідно. Тому я вважаю, що в моєму регулярному висловленні щось не так, навіть якщо я скопіював і вставив це з Документації. http://code.google.com/p/haproxy-docs/wiki/reqrep

Резюме: Я намагаюся маршрутизувати трафік на основі URI, однак я хочу, щоб HAProxy знімав URI, коли він надсилає запит до резервного пулу.

Дякую!

-Джим


Зараз є кнопки редагування та коментування.
Кріс С

1
Джіме, у вас виникли проблеми з коментуванням, оскільки ви ввійшли в обліковий запис, який ви не використовували для створення цього питання. Будь ласка, спробуйте дотримуватися свого облікового запису для входу, щоб цього не сталося в майбутньому. Я позначив модератора, щоб виправити це.
MDMarra

Відповіді:


28

У вас це є:

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

Я думаю, ти хочеш цього:

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

Різниця полягає в тому, що другий спрацює, якщо /Ne пропустити webN.

Відповідаючи на ваш коментар нижче, детально розповідайте про те, як працюють вирази вище, ніж я можу докласти. Однак, можливо, це допоможе.

Все перед / web1 "захоплює" все, що йде перед web1, у рядок запиту. Так зазвичай це буде GET або POST. (. *) "Захоплює" все після web1, включаючи нічого, якщо нічого немає.

Наступна частина ( \1\2) говорить про те, що робити з захопленими частинами. Він говорить про те, щоб утворити рядок, що складається з \1(першої захопленої частини) та \2(слідом за другою захопленою частиною). Оскільки web1 ніколи не захоплюється, він не збирається до кінцевого результату.


Що означає \ 1 \ \ 2 \ 3? Що стосується документації на reqrep, що робить ^ ([^ \] *) \? Ось приклад, наведений на сторінці документації. # замініть "/ static /" на "/" на початку будь-якого шляху запиту. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Джим

Прочитавши ваш коментар, я зрозумів, що запропоноване нами рішення було трохи надмірно складним. Я спростив це.
longneck

Отже, що таке синтаксис reqrep? reqrep {string_2_search_thru} {search_string} {substitu_string}? Я плутаюся в \ 1 \ \ 2 \ 3?
Джим

Чи є спосіб включити цей reqrep до роботи, якщо користувач ставить / web1 або / web1 /?
Джим

Ви пробували?
longneck

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.