Я использую контейнер 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.