有没有办法使用多个阈值对HAProxy的限制连接进行评级

我使用HaProxy实现了简单的速率限制,就像StackExchange与HaProxy一样。 我试图让它更高级,以便有多个速率限制阈值。

例如,限制请求的客户端:

  • 15 /分钟

  • 60 /小时

  • 360 /天

看来我需要多个表格来存储不同采样率的相同数据。 该文件指出:

每个代理只有一个粘贴表。 在编写这个文档的时候,每个代理有多个表似乎不是很有用。 如果发生这种情况,只需在其中创build一个虚拟后端并将其引用即可。

不幸的是,我有一个魔鬼试图找出如何将数据存储到虚拟后端表。

我也开放其他方法,HaProxy只是看起来像一个有前途的道路,因为我们已经在环境中有它的意义。 任何build议表示赞赏。

  • 心跳感知负载平衡
  • hdr_sub模式匹配的格式
  • 使用心跳和起搏器的高可用性configuration
  • 使用haproxy和http-send-name-header主机进行负载平衡
  • haproxy在代理请求时如何解码URL
  • FTP通过HAProxy
  • One Solution collect form web for “有没有办法使用多个阈值对HAProxy的限制连接进行评级”

    我只是试图自己做这个,没有运气,并决定诉诸我的谷歌福。 对于我来说,寻找多层次的速率限制是最重要的结果,我非常兴奋。 然后,我看到它没有答案,最初陷入了一个绝望的存在坑。 在挖掘出自己的身份之后,我一直在窃窃私语,幸运的是,我似乎已经想出了如何做到这一点,至less是为了我所需要的。 也许它也适用于你。

    Haproxy真的很酷,我很兴奋地开始使用它来代替我们当前的负载平衡解决scheme,但是stick-table有点怪怪的东西来包裹你的头。 在这方面,我发现了一个似乎对我有帮助的一般原则,那就是在试图用多个粘贴表进行设置时,明确地指出每个粘贴表的名称。 默认的行为,名称是隐含的(假定是你所在的后台),除非你开始尝试使用多个表格。 所以这就是为什么在我的configuration下面,有些是比它更冗长。 我只是觉得更容易遵循这种逻辑。 无论如何,这里(注意,这是基于一个Moodle应用程序的Cookie,而不是IP,它使用haproxy v1.5.11):

    backend dynamic_60 stick-table type string len 36 size 1m store gpc0_rate(60s) backend dynamic stick-table type string len 36 size 1m store gpc0_rate(10s) stick on cookie(MoodleSession) table dynamic stick on cookie(MoodleSession) table dynamic_60 tcp-request content track-sc0 cookie(MoodleSession) table dynamic tcp-request content track-sc1 cookie(MoodleSession) table dynamic_60 acl rate_10s sc0_inc_gpc0(dynamic) gt 0 acl rate_60s sc1_inc_gpc0(dynamic_60) gt 0 tcp-request content reject if rate_10s rate_60s FALSE 

    所以,这样做是设置一个计数器logging每10秒的速率,另一个logging每60秒的速率。 请注意,实际上并没有使用这些计数器来进行任何速率限制。 但是你可以通

     echo "show table dynamic" | socat /var/run/haproxy/admin.sock stdio echo "show table dynamic_60" | socat /var/run/haproxy/admin.sock stdio 

    费率柜台正在分开维持。

    我想找出我需要的最小configuration来让这些计数器实际增量,这就是为什么在“tcp-request content reject”语句结尾处看到“FALSE”的原因。 只要用计数器定义acls就不会让它们增加。 你必须实际使用acl。 在最后加上“FALSE”只允许我使用acl而不满足条件来实际拒绝请求。 一旦我决定了一些真正的数字,我可能会拿出“错误”。

    获取多个粘贴表的真正关键似乎是在“stick on”,“track-sc {0 | 1 | 2}”和使用“sc {0,1,2} _inc_gpc0”中的acl定义后端,你实际上处理请求。 将其中的任何一个移动到dynamic_60后端导致计数停止工作。 我想这是因为跟踪或将acls应用于不服务请求的后端是没有意义的,因为它实际上并没有要求从中获取信息。 这就是说,我相信别人会有更好的解释。 我对haproxy很新。

    我问的下一个问题是:我只能跟踪3件事情(因为“track-sc”configuration设置只能从0-2)。 我相信,是的,你只能跟踪这三件事情。 但是重要的是, 每个后端都有3件事实际上服务于一个请求。 因此,例如,如果像我一样,您希望对静态内容进行不同的速率限制而不是dynamic内容,那么您可以决定是否转到前端的“静态”或“dynamic”后端,这取决于请求。 然后在“静态”后端,你可以在“静态”和“静态60”后端(如果你碰到类似的命名scheme,我上面提到的configuration)定义track-sc0和track-sc1。 然后,您将有4个表格用于制定费率限制决定。 10秒和60秒的dynamic和静态内容。 使用第三个计数器,我认为你可以得到你的3个级别,但我认为这将是极限。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.