dynamic地重新configurationhaproxy后端

我的要求是有约50 haproxy HTTP后端,这将被dynamic地添加和删除(没有我的参与)在内部networking的任何地方。 我可以假设每个http后端知道它的IP地址并知道haproxy的IP地址。 我可以假设我可以向每个http后端添加一点代码,以便在haproxy注册时,只要它启动并注销,就会在注销之前注销。

我有haproxy在80端口收听:

frontend main *:80

另外我公开一个统计sockets:

stats socket 0.0.0.0:8080

我的设置工作,特别是我可以使用socat readline TCP4:<haproxyIP>:8080连接到统计套接字socat readline TCP4:<haproxyIP>:8080

让我们假设在10.0.0.1:404010.0.0.2:4040上有两个http后端服务,并且haproxy可以到达两个地址。

我需要通过统计套接字发送什么stat套接字命令,以便对<haproxyIP>:8080/backend1/status任何请求路由到10.0.0.1:4040/status并且对<haproxyIP>:8080/backend2/version路由到10.0.0.2:4040/version

一般情况下:如何将[GET|POST] <haproxyIP>:<haproxyPort>/<backendID>/<remainingPath> http请求dynamic代理为[GET|POST] <backendIP>:<backendPort>/<remainingPath>我知道从backendID -> backendIP, backendPort的地图。

如果您到达此前端的所有请求均采用以下forms:

 frontend main bind *:80 # Use separate bind directives as they are supported by new HAProxy versions use_backend %[path,fields(2,/)] backend backend1 reqrep ^([^\ :]*)\ /backend1/(.*) \1\ /\2 server foo ... backend backend2 reqrep ^([^\ :]*)\ /backend2/(.*) \1\ /\2 server bar ... 

如果你有一些不是这种格式的请求,你可以添加更多的use_backend -s或者default_backend。 您也可以让生成configuration的编排工具生成一个包含所有后端名称的平面文件,然后您可以使用它来获得更多的逻辑

 acl existing_backends path -f all_backends.txt -m beg 

all_backends.txt看起来像这样:

 /backend1/ /backend2/ ... 

根据你正在使用的确切的HAProxy版本,这可能会稍微优化(使用引号,variables等),但这种方式应该与1.5 +。

您可以使用unix套接字命令来实现这一点。 看看management.txt doc文件的第9.2点。

有第三方工具,像haproxyctl使用这个'api',但我没有任何经验。