有没有办法使用多个阈值来限制与 HAProxy 的连接速率

pal*_*rse 5 haproxy rate-limiting

我实现了简单的速度以类似的方式来StackExchange的方式使用HAProxy的限制做它与HAProxy的。我试图让它更高级一点,以便有多个速率限制阈值。

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

  • 15/分钟

  • 60/小时

  • 360/天

似乎我需要多个棒表来存储具有不同采样率的相同数据。该文件指出:

每个代理只有一个stick-table。在撰写本文档时,每个代理拥有多个表似乎没有用。如果碰巧需要这样做,只需创建一个带有stick-table 的虚拟后端并引用它。

不幸的是,我有一段时间试图弄清楚如何将数据存储到虚拟后端表中。

我也对其他方法持开放态度,HaProxy 似乎是一条很有前途的道路,因为我们已经在环境中使用了它,所以它是有道理的。任何建议表示赞赏。

小智 12

我只是想自己做这件事,运气不好,决定求助于我的 google-fu。在寻找多个级别的速率限制时,我的最佳结果是这个,我真的很兴奋。然后我看到它没有答案,最初陷入了绝望的生存深渊。在挖掘自己之后,我继续进行黑客攻击,幸运的是,我似乎已经找到了至少对于我需要的方法。也许它也适合你。

Haproxy 真的、真的很酷,我很高兴开始使用它代替我们当前的负载平衡解决方案,但是棒表有点让人头疼。在这方面,我发现了一个似乎对我有帮助的一般原则,那就是明确提及每一个当您尝试使用多个棒表进行设置时,按名称棒表。默认行为,其中名称是隐式的(假设是您所在的后端),很棒……除非您开始尝试使用多个棒表。所以这就是为什么在我下面的配置中,其中一些比它必须的更冗长。我只是发现这样更容易遵循逻辑。无论如何,这里是(请注意,这是基于 Moodle 应用程序的 cookie 计算的,而不是 IP,并且它使用 v1.5.11 的 haproxy):

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
Run Code Online (Sandbox Code Playgroud)

所以,它所做的是设置一个计数器来记录每 10 秒的速率,另一个来记录每 60 秒的速率。请注意,它实际上还没有使用这些计数器来进行任何速率限制。但您可以通过以下方式验证:

echo "show table dynamic" | socat /var/run/haproxy/admin.sock stdio
echo "show table dynamic_60" | socat /var/run/haproxy/admin.sock stdio
Run Code Online (Sandbox Code Playgroud)

速率计数器是单独维护的。

我想找出让这些计数器实际递增所需的最低配置,这就是为什么您会在“tcp-request content reject”语句的末尾看到“FALSE”。仅用计数器定义 acls 不会使它们增加。您必须实际使用 acl。将“FALSE”放在最后只是让我在不满足实际拒绝请求的条件的情况下使用 acl。一旦我决定了这些 acl 的一些真正的数字,我可能会去掉“FALSE”。

让多个棒表工作的真正关键似乎是使用“sc{0,1,2}_inc_gpc0”在您实际处理请求的后端。将其中任何一个移动到 dynamic_60 后端会导致其计数停止工作。我想原因是跟踪或应用 acls 到不服务请求的后端是没有意义的,因为它实际上并没有通过请求从中提取信息。也就是说,我相信其他人会有更好的解释。我对 haproxy 很陌生。

我问的下一个问题是:我是否仅限于跟踪 3 件事(因为“track-sc”配置设置仅从 0-2 开始)。我相信,是的,您只能跟踪三件事。但重要的是,它3 件事实际服务于请求的后端。因此,例如,如果像我一样,您想对静态内容与动态内容进行不同的速率限制,您可以根据要求。然后在“静态”后端中,您在“静态”和“静态_60”后端上定义 track-sc0 和 track-sc1(如果您碰巧遵循与我上面放置的配置类似的命名方案)。然后您将有 4 个棒表用于做出限速决策。动态和静态内容的 10 秒和 60 秒速率。使用第 3 个计数器,我认为您可以进入 3 个级别,但我认为这将是限制。