Назад | Перейти на главную страницу

HAProxy reqrep удалить URI по бэкэнд-запросу

очень быстрый вопрос относительно HAProxy reqrep. Я пытаюсь переписать / заменить запрос, который отправляется на бэкэнд.

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

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

Я хочу, чтобы web1 перешел на backend 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 при отправке запроса в бэкэнд-пул.

Спасибо!

-Джим

У вас есть это:

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

Я думаю, вы этого хотите:

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

Разница в том, что второй будет работать, если опустить / после webN.

В ответ на ваш комментарий ниже подробно рассказать о том, как работают приведенные выше выражения, - это больше усилий, чем я могу приложить. Однако, возможно, это поможет.

Все, что предшествует / web1, «захватывает» все, что предшествует web1 в строке запроса. Обычно это GET или POST. (. *) "Захватывает" все, что находится после web1, включая ничего, если ничего нет.

Следующая часть (\1\2) говорит, что делать с этими захваченными частями. Он говорит, что нужно сформировать строку, состоящую из \1 (первая захваченная часть) и \2 (за ней следует вторая захваченная часть). Поскольку web1 никогда не захватывается, он не собирается в окончательный результат.

Поместите это на интерфейс

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

Хороший урок научиться раздевать веревку: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5