我的要求是拥有大约 50 个 haproxy http 后端,这些后端将在内部网络的任何地方动态添加和删除(无需我的参与)。我可以假设每个 http 后端都知道其 IP 地址,并且知道 haproxy 的 IP 地址。我可以假设我可以向每个 http 后端添加一些代码,以允许它在启动时向 haproxy 注册,并在关闭前取消注册。
我有 haproxy 监听端口 80:
frontend main *:80
另外,我还公开了一个统计套接字:
stats socket 0.0.0.0:8080
我的设置有效,特别是我可以使用以下方式连接到统计套接字socat readline TCP4:<haproxyIP>:8080
假设我们有两个在10.0.0.1:4040
和上提供服务的 http 后端10.0.0.2:4040
,并且 haproxy 可以访问这两个地址。
我需要在 stat 套接字上发出什么 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>
一般来说:假设[GET|POST] <backendIP>:<backendPort>/<remainingPath>
我知道从 的映射,我如何动态代理从 到 的 http 请求backendID -> backendIP, backendPort
。
答案1
如果到达此前端的所有请求都采用以下形式:
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。您还可以让生成配置的编排工具生成一个包含所有后端名称的平面文件,然后您可以将其用于更多逻辑
acl existing_backends path -f all_backends.txt -m beg
其中所有后端.txt看起来像:
/backend1/
/backend2/
...
根据您所使用的 HAProxy 的具体版本,这可能会有所优化(使用引号、变量等),但这样它应该可以与 1.5+ 一起使用。
答案2
你可以使用 unix 套接字命令来实现这一点。请查看管理.txtdoc 文件。
有第三方工具使用此“api”,例如haproxyctl,但我对它们没有任何经验。