如何基于请求体来路由HAProxy的流量(反向代理)

时间:2014-04-24 04:28:57

标签: acl haproxy

我正在尝试根据以下POST主体中标识的URL将以下请求路由到相应的服务器。我希望通过使用HAProxy的反向代理来实现这一目标。

E.g。我想将所有请求定向到HAProxy,而不是让HAProxy检查POST主体中是否存在某些值(例如通知URL值“pingpong”),如果是这种情况,请将流量路由到我将指定的endopint配置。

POST /someURL/file.jsp HTTP/1.1
Host: 10.43.90.190:80
Content-Type: application/json
Connection: keep-alive
Accept: */*
Content-Length: 256

{"Info": {"groupName":"thisgroup1","Id":"M1234R456","id2":"TUP1234",
    "countryCode":"USA","carrierCode":"USAIC","e164Address":"123456768789",
    "notificationURL":"http:\/\/www.pingpong.com\/notify",
    "timestamp":"2014-03-04T17:33:30.000Z"}}

有没有办法使用acl在请求体中搜索内容“pingpong”,并根据这个值,我会适当地路由它?

谢谢!

2 个答案:

答案 0 :(得分:4)

这可以使用简单的访问控制列表(ACL)来完成。但是,在Haproxy 1。0(2015年10月)之前,这是不可能的,你可以在你的前端包含这个选项:

option http-buffer-request

此选项可让Haproxy访问正文。然后你可以使用req.body来访问正文。例如:

frontend http-in
             bind *:80
             option http-buffer-request
             acl redirect_pingpong req.body -m reg [insert your regular expression here]
             use_backend pingpong_backend if redirect_pingpong

             default_backend web_bk

然后继续定义你的后端。

可以找到有关访问正文内容的更多信息here,并且可以找到有关ACL的信息here

答案 1 :(得分:-1)

有可能在nginx / tengine中解决这个问题,但我仍然没有发现在HAProxy中,如果你可以切换到tengine / nginx,你可以使用nginx_http_lua_module。我仍然必须警告你,它有一些我还没有解决的性能问题,