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

haproxy переслать uri в корень другого сервера

Я использую контейнер HAPROXY в качестве точки входа для виртуального кластера HPC. В зависимости от префикса запрос перенаправляется в разные контейнеры.

:80/foswiki/ -> :80/foswiki/
:80/kibana/ -> :80/kibana/
:80/graphite-api/ -> :80/graphite-api/
...

Конфигурация, которую я использую, довольно проста:

frontend http-in
    bind *:80
    acl uri_foswiki path_beg /foswiki
    use_backend srv_foswiki if uri_foswiki
    # gitlab
    default_backend srv_gitlab

backend srv_foswiki
    balance roundrobin
    cookie SERVERID insert
    option httpclose
    option forwardfor
    server foswiki 172.17.0.3:80 cookie

Дело в том, что есть веб-серверы, которые обслуживают сайт напрямую как root, без префикса. «Графитовая паутина», например или изображение gitlab.

Я пытаюсь обрезать префикс и пересылать его дальше, но на самом деле я хочу, чтобы haproxy сохранял префикс в пути и чтобы он был прозрачен для внутреннего сервера. Если я нажму на «gitlab_server: 80 / dashboard /», он должен получиться как «frontend_ip: 80 / gitlab / dashboard».

backend srv_gitlab
    balance roundrobin
    #cookie SERVERID insert
    mode http
    reqrep ^([^\ ]*)\ /gitlab/(.*)     \1\ /\2
    balance roundrobin
    option forwardfor
    server gitlab 172.17.0.18:80 cookie

Я не думаю, что это сложно, но мне кажется, что мои навыки работы с Google несколько ослаблены. Каждый раз я получаю правила перезаписи, которые не сохраняют префикс.

Кто угодно? Христианин

EDIT: внутренние IP-адреса недоступны для пользователя ...

Чтобы избавиться от ведущих частей URI, попробуйте

reqrep ^(GET|POST)\ /gitlab/(.*) \1\ /\2

т.е. извлечь HTTP method в \1 и путь, следующий за корнем gitlab в \2, а затем привязать их к полному запросу.

Обратите внимание, что это может не подойти для многих приложений, потому что сервер приложений не знает, что клиенты должны запрашивать все из виртуального gitlab/ корневая директория. Таким образом, переадресация, по-видимому, «лишит» важный корневой каталог.

Такие сценарии решаются легче, например с участием nginx и это mod_proxy или даже Apache.