Я изо всех сил пытался заставить эту конфигурацию ограничения скорости работать на HAProxy. Как видно ниже, я пытаюсь использовать "sc2_get_gpc0", чтобы получить второе значение, хранящееся в таблице ручки hour_hold. Это значение gp c увеличивается каждый раз, когда делается запрос, когда клиент уже достиг стандартного ограничения скорости. Это значение должно оставаться в таблице в течение 1 часа. Кажется, мне не удается заставить acl обнаружить, что значение больше 0, и заблокировать соединения после того, как стандартное ограничение скорости "is_abuse" прошло 20 секунд без скорости запросов, превышающей 10 запросов за 20 секунд.
backend hour_hold
stick-table type binary len 8 size 100k expire 60m store gpc0
backend backend
stick-table type binary len 8 size 100k expire 60m store http_req_rate(20s)
http-request track-sc1 base32+src table backend
http-request set-var(req.rate_limit) path,map_beg(/usr/local/etc/haproxy/rates.map,10)
http-request set-var(req.request_rate) base32+src,table_http_req_rate(backend)
acl is_abuse var(req.rate_limit),sub(req.request_rate) lt 0
http-request track-sc2 base32+src table hour_hold if is_abuse
http-request sc-inc-gpc0(2) if is_abuse
# acl inc_abuse_cnt sc2_inc_gpc0(hour_hold) gt 0
acl abuse_cnt sc2_get_gpc0(hour_hold) gt 0
http-request deny deny_status 429 if is_abuse or abuse_cnt
# http-request deny deny_status 429 if abuse_cnt
# http-request deny deny_status 429 if is_abuse inc_abuse_cnt```