Greetings,

On 08/12/2016 11:01 AM, Artem Lalaiants wrote:
Hello,

I'm trying to limit traffic based on the amount of http requests load balancer handles at the moment. The goal is to limit http requests globally, same way it works with http_req_rate() but globally - not per IP. For example, use another backend (with a custom error page) if it gets more then 10 http requests for the last 10 seconds. After 10th second the counter must be dropped and start counting again.

My example here uses the http_req_rate, so its a running average vs counting up and then dropping once 10s is up. Other than having a script clearing the table via socket on a timer I can't think of an easy way to handle a sudden expiration.

Is there a way to do that with haproxy?

Add the following above the frontend in question (you could keep it in the same frontend if there is just one of them, but I like the clarity of having them outside (and it allows for more than one)):

backend global-rate-limit
    stick-table size 1 expire 10s type integer store http_req_rate(10s)

In the frontend(s) in question:
  tcp-request content track-sc0 int(0) table global-rate-limit
  use_backend my_overlimit_backend if { sc_http_req_rate(0) gt 9 }

In this case the 'int(0)' just makes it store 0 in the stick table so everything is tracked in the same entry. Can also use fe_id() to make it per frontend sharing the same table (make sure to increase the size if you do that) and other similar things.

Thanks,
- Chad

Any advice is highly appreciated! Thank you.

--
Artem Lalaiants
​DevOps Lead
, GeoComply
skype: artem.kharkov
www.geocomply.com <http://www.geocomply.com/>

/CONFIDENTIALITY NOTICE: The information contained in this email message is intended only for use of the intended recipient. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately delete it from your system and notify the sender by replying to this email./


Reply via email to