在开发环境中,我需要使用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机器:
docker build -t haproxy-local . && docker run --rm -p80:80 haproxy-local
我的角度客户端在端口4200上的主机上启动。我的端口8080上的后端服务正在运行。如果我访问http://localhost:80,我的Web客户端将在Web浏览器中打开。不幸的是,如果我尝试使用http://localhost/api-my-backend-service/123访问后端,则无效。如果我将其更改为
default_backend api-backend
我可以通过http://localhost/api-my-backend-service/12访问后端,但不能访问客户端。
因此,对两个后端的访问似乎都有效,因为如果我更改默认后端,我可以访问客户端和api后端。但是use_backend似乎不匹配,我无法弄清楚原因。
有什么想法吗?
由于 迈内特
答案 0 :(得分:0)
作为一种解决方法,我切换到nginx,它可以用作反向代理,这足以满足我的需求。
但我仍然对上述问题的原因感兴趣。
答案 1 :(得分:0)
我有一个类似的问题陈述,这就是我的解决方法:
例如:
Angular routes supported in my app :
'login', 'h/dashboard' in which case my url would be
localhost:4200/#/login, localhost:4200/#/h/dashboard
这些路由将在其相应的角度组件中对我的springboot进行后续的http调用。
localhost:4200/#/login -> localhost:8082/login
localhost:4200/#/h/dashboard -> localhost:8082/api/dashboard
在8082上具有@Restcontroller端点为'/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
请注意,在有角度的应用程序-> 之前中,使用 haproxy ,我将url端点用于localhost的springboot调用: 8082 /登录。 (包括 haproxy )后,已更改为localhost: 9090 / login,代理将负责路由到springboot应用。 >