我想使用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
作为变量?
答案 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。