有人知道使用HAProxy在达到特定最大数量的请求后将传入请求添加到延迟的方法,而不仅仅是拒绝或发送状态代码,实际排队特定的IP地址'请求,如果不是太多,请在数量减少后允许。
使用文档所有上述部分似乎都是独立的,尽管结合似乎是一个问题。
我的前端有以下内容:
#Add counter to ip in ratelimiting table
tcp-request content track-sc0 src table ratelimiting
# if alot of requests (more than 1000) - reject
acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000
tcp-request content reject if mark_alot_of_requests TRUE
#If concurrent requests >= 100 from a single IP return 429
acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100
use_backend 429_slow_down if mark_too_many_requests
然后
backend 429_slow_down
mode http
timeout tarpit 5s
reqitarpit .
errorfile 500 /etc/haproxy/errors/429.http
http-request tarpit
我的停机坪是否确实减慢了它们的速度,但并没有按照我最初的想法行事。
速率限制表在listen中创建如下:
listen ratelimiting
mode http
stick-table type ip size 1m expire 1h store conn_rate(5000),conn_cur
非常感谢
答案 0 :(得分:2)
我会在前端部分使用inspect-timeout
' WAIT_END`
frontend mywww
tcp-request content track-sc0 src table ratelimiting
acl mark_alot_of_requests sc0_conn_rate(ratelimiting) gt 1000
tcp-request content reject if mark_alot_of_requests TRUE
acl mark_too_many_requests sc0_conn_cur(ratelimiting) ge 100
# delay for request inspect, it will be used for effectively client delay
tcp-request inspect-delay 1000ms
# if client is not too fast let it through
tcp-request content accept unless mark_too_many_requests
# too fast clients, will need to wait entire inspect-delay
tcp-request content accept if WAIT_END
use_backend some_normal_backend