无法在 HAProxy 中增加 Stick Table 计数器

无法在 HAProxy 中增加 Stick Table 计数器
Excerpt from cfg

Backend1
    mode http
    acl is-error res.hdr(status) 403
    http-request track-sc2 src table error-count
    http-response sc-inc-gpc0(2) if is-error

option httpchk
    balance static-rr
    server serverA [serverip-here] check inter 5s downinter 4s maxconn 4000
    server serverB [serverip-here] check inter 5s downinter 4s maxconn 4000
backend error-count
    stick-table type ip size 1m expire 3m store gpc0

我在浏览器上强制出现 403 错误后的结果:

# table: error-count, type: ip, size:1048576, used:1
0x562d0383ccc8: key=IPdisplays-here use=0 exp=173781 gpc0=0

我可以看到 IP 正在被跟踪,并且过期没有问题,但我无法让 gpc0 在 stick 表中更新。它仍然是 0。

我尝试过各种匿名和其他 ACL 以及表类型字符串。没有运气。谷歌什么也没有。任何想法都值得赞赏。

谢谢!

答案1

在 HTTP 中,没有一个名为 的标准响应标头status,因此此 ACL 永远不会匹配:

acl is-error res.hdr(status) 403

但是,第 7 层可以获取status

status: 整数

返回包含 HTTP 响应中的 HTTP 状态代码的整数,例如 302。它主要用于 ACL 和整数范围内,例如,如果响应不是 3xx,则删除任何 Location 标头。

http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-status

我认为你的本意是这样的:

acl is-error status 403

...或者如果您更喜欢明确的比较表达式,请指定整数匹配:

acl is-error status -m int 403

所有版本的 HAProxy 都提供抓取status功能,至少可以追溯到 1.5 版,甚至更早的版本。

答案2

我不确定您是否可以在请求中跟踪的响应中增加粘性计数器。有一个类似的 http-response track-sc2,但我认为它们不会交叉。

https://www.haproxy.com/documentation/hapee/1-9r1/onepage/#4.2-http-response%20track-sc0

答案3

我正在做一些非常相似的事情。我不确定为什么我的有效而你的无效。我肯定是在请求中跟踪的响应中增加了一个计数器。我确实看到 gpc0 在我的设置中递增。一个可能的区别:我的 sc 操作是在前端。另外,我使用的是 sc0 而不是 sc2。我认为这两个都不重要。我正在运行 1.8.8。我的 cfg 摘录:

在 FE 中:

http-request track-sc0 src table Penalty_Box
http-response sc-inc-gpc0(0) if { status 403 } || { status 404 }    
http-request deny if { sc_get_gpc0(0) gt 5 }

BE 粘贴表:

后端Penalty_Box

 stick-table type ip size 2000 expire 10m store http_req_rate(10s),gpc0

如果您已设法使您的配置正常工作,我当然想知道您必须做什么。

相关内容