haproxy use_backend path_reg не совпадает

в среде разработки мне нужно получить доступ к моему клиенту и ко всем моим внутренним службам, используя localhost:80. Поэтому я хочу использовать haproxy для сопоставления запросов с нужными службами.

Я создал следующий Dockerfile для запуска haproxy:

FROM haproxy:1-alpine
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

Мой файл haproxy.cfg выглядит так:

defaults
  timeout client        30s
  timeout server        30s
  timeout connect       30s

frontend MyFrontend
  bind  *:80
  acl url_api path_reg ^/api-.*
  use_backend api-backend if url_api
  default_backend web-backend

backend api-backend
    mode            http
    server      backend host.docker.internal:8080

backend web-backend
    mode            http
    server      client host.docker.internal:4200

Я запускаю докер-машину с помощью следующей команды:

docker build -t haproxy-local . && docker run --rm -p80:80 haproxy-local

Мой угловой клиент запускается на хост-компьютере через порт 4200. Моя серверная служба работает через порт 8080. Если я захожу на http://localhost:80, мой веб-клиент открывается в веб-браузере. К сожалению, если я попытаюсь получить доступ к серверной части, используя http://localhost/api-my-backend-service/123 не работает. Если я изменю его на

default_backend api-backend

Я могу получить доступ к серверной части через http://localhost/api-my-backend-service/12 но не клиент.

Таким образом, доступ к обоим бэкендам, кажется, работает, потому что, если я изменю бэкэнд по умолчанию, я смогу получить доступ как к клиенту, так и к бэкенду API. Но use_backend, похоже, не совпадает, и я не могу понять, почему.

Любые идеи?

Спасибо Мейнерт


person Meinert Schwartau    schedule 18.04.2018    source источник


Ответы (2)


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

Но меня все равно интересовала бы причина моих проблем выше.

person Meinert Schwartau    schedule 18.04.2018

У меня есть аналогичная постановка проблемы, и вот как я ее решил:

Ex:

Angular routes supported in my app :
'login', 'h/dashboard' in which case my url would be 
localhost:4200/#/login, localhost:4200/#/h/dashboard

Эти маршруты будут делать последующие http-вызовы моей Springboot в соответствующих угловых компонентах.

localhost:4200/#/login -> localhost:8082/login
localhost:4200/#/h/dashboard -> localhost:8082/api/dashboard

с конечными точками @Restcontroller на 8082 как '/login', '/api/**'

frontend myApp
  bind 127.0.0.1:9090
  mode http
  acl acl_proxyUi path_reg ^login$
  acl acl_proxyUi2 path_reg ^h/..*$  
  acl acl_proxyWeb path_reg ^/api/..*$
  acl acl_proxyWeb2 path_reg ^/login$

  use_backend app-web if acl_proxyWeb or acl_proxyWeb2
  use_backend app-ui if acl_proxyUi or acl_proxyUi2 
#  default_backend app-web
  default_backend app-ui

backend app-web
  mode http
  balance roundrobin
  server webserver 127.0.0.1:8082 


backend app-ui
  mode http
  balance roundrobin
  server nodeserver 127.0.0.1:4200 

Обратите внимание, что в приложении angular -> до использования haproxy я использовал конечную точку URL-адреса для вызовов Springboot как localhost:8082/login. После включения haproxy, который был изменен на localhost:9090/login, и прокси-сервер позаботится о маршрутизации в приложение Springboot.

person Swetha V    schedule 10.07.2018