очень быстрый вопрос относительно 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 при отправке запроса в бэкэнд-пул.
Спасибо!
-Джим
Ответы:
У вас есть это:
Я думаю, что вы хотите это:
Разница в том, что второй будет работать, если / после webN опущен.
В ответ на ваш комментарий ниже, вдаваться в подробности о том, как работают приведенные выше выражения, - это больше усилий, чем я могу дать. Однако, возможно, это поможет.
Все до / web1 "захватывает" все, что находится перед web1 в строке запроса. Так что обычно это будет GET или POST. (. *) «Захватывает» все после web1, включая ничего, если ничего нет.
Следующая часть (
\1\2
) говорит, что делать с этими захваченными частями. Это говорит, чтобы сформировать строку, состоящую из\1
(первая захваченная часть) и\2
(сопровождаемая второй захваченной частью). Поскольку web1 никогда не записывается, он не собирается в окончательный вывод.источник
Поместите это на фронтэнд
Хороший урок научиться раздевать строку: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
источник