haproxy 将 uri 转发到另一台服务器的根目录

kni*_*ert 5 haproxy docker

我使用 HAPROXY 容器作为虚拟 HPC 集群的入口点。根据前缀,请求被转发到不同的容器。

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

我使用的配置非常简单:

前端http-in
    绑定 *:80
    acl uri_foswiki path_beg /foswiki
    use_backend srv_foswiki 如果 uri_foswiki
    # GitLab
    default_backend srv_gitlab

后端 srv_foswiki
    平衡循环
    cookie SERVERID 插入
    选项 httpclose
    选项转发
    服务器 foswiki 172.17.0.3:80 cookie

问题是有网络服务器直接以 root 身份为网站提供服务,没有前缀。'Graphite-web',例如或 gitlab 图像。

我尝试削减前缀并进一步转发它,但我真正想要的是 haproxy 将前缀保留在路径中,并且它对后端服务器是透明的。如果我点击“gitlab_server:80/dashboard/”,它应该显示为“frontend_ip:80/gitlab/dashboard”。

后端 srv_gitlab
    平衡循环
    #cookie SERVERID 插入
    模式http
    reqrep ^([^\ ]*)\ /gitlab/(.*) \1\ /\2
    平衡循环
    选项转发
    服务器 gitlab 172.17.0.18:80 cookie

我不认为这是一件很难的事情,但在我看来,我的谷歌技能有点残废。每次我最终都会重写不保留前缀的规则。

任何人?基督教

编辑:用户无法访问内部 IP 地址...

Fel*_*ank 1

要摆脱 URI 的前导部分,请尝试

reqrep ^(GET|POST)\ /gitlab/(.*) \1\ /\2
Run Code Online (Sandbox Code Playgroud)

即,将HTTP methodinto\1和 gitlab 根目录后面的路径提取到 into \2,然后将它们连接到完整的请求。

请注意,这对于许多应用程序来说可能不会减少,因为应用程序服务器不知道客户端应该从虚拟gitlab/根目录中请求所有内容。因此,重定向显然会“剥离”重要的根目录。

这种情况可以更容易地解决,例如使用nginx它的mod_proxy甚至 Apache。