【问题标题】:haproxy use_backend path_reg does not matchhaproxy use_backend path_reg 不匹配
【发布时间】:2018-07-10 21:53:03
【问题描述】:

在开发环境中,我需要使用 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

我的 Angular 客户端在 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 似乎不匹配,我无法弄清楚原因。

有什么想法吗?

谢谢 迈纳特

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    作为一种解决方法,我切换到 nginx,它可以用作反向代理,足以满足我的需求。

    但我仍然会对上述问题的原因感兴趣。

    【讨论】:

      【解决方案2】:

      我有一个类似的问题陈述,这就是我解决它的方法:

      例如:

      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 的 angular app -> before 中,我将 url 端点用于 springboot 调用作为 localhost:8082 /登录。 包括 haproxy 之后,已更改为 localhost:9090/login 并且代理将负责路由到 springboot 应用程序。

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2021-06-10
        相关资源
        最近更新 更多