HAProxy减慢了来自特定IP的连接

时间:2017-05-04 07:42:06

标签: haproxy

有人知道使用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

非常感谢

1 个答案:

答案 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