HAProxy 将 URI 转发到另一台服务器的根目录

HAProxy 将 URI 转发到另一台服务器的根目录

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

:80/foswiki/ -> :80/foswiki/
:80/基巴纳/-> :80/基巴纳/
:80/石墨-api/->:80/石墨-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 地址...

答案1

要删除 URI 的前导部分,请尝试

reqrep ^(GET|POST)\ /gitlab/(.*) \1\ /\2

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

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

这种情况更容易解决,nginx例如mod_proxy甚至是 Apache。

相关内容