使用haproxy实施与正常服务器计数有关的速率限制

时间:2019-01-17 15:27:56

标签: haproxy rate-limiting

我想使用HAProxy的粘性表来实现限速系统。假设我有100台服务器,并且每台服务器限制10个请求,则ACL为

http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(100) gt 10 }

现在,如果我想根据正常运行的服务器数量来使此动态变化,我需要为每个100转换器替换硬编码的nbsrv

http-request track-sc0 int(1) table GlobalRequestsTracker
http-request deny deny_status 429 if { sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend)) gt 10 }

但是我得到了错误:

error detected while parsing an 'http-request deny' condition : invalid args in converter 'div' : expects an integer or a variable name in ACL expression 'sc0_http_req_rate(GlobalRequestsTracker),div(nbsrv(MyBackend))'.

nbsrv运算符中是否可以使用div作为变量?

1 个答案:

答案 0 :(得分:1)

据我所知,

HAProxy 不允许嵌套函数调用。但是您可以将后端服务器的数量存储在一个变量中,并在分区中使用它(请参见 HAProxy 文档中的http-request set-var)。我尚未对其进行测试或使用过个性化设置,但我想它可能看起来像:

frontend <fe>
    http-request track-sc0 int(1) table <tbl>
    http-request set-var(req.<var>) nbsrv(<be>)
    http-request deny deny_status <code> if { sc0_http_req_rate(<tbl>),div(req.<var>) gt <val> }

请参见 HAProxy documentation