【问题标题】:How can I implement server-side rate limiting for a Perl web service?如何为 Perl Web 服务实现服务器端速率限制?
【发布时间】:2010-10-04 19:46:13
【问题描述】:

我有一个基于 Perl 的 CGI/Fast CGI Web 服务,并希望通过 IP 地址对客户端进行速率限制,以阻止激进的客户端导致过多的工作。

我查看了一些代码并在 CPAN 中找到了 Algorithm::TokenBucket,但这是针对客户端请求的;它没有持久性,也没有针对每个用户的配置,因此对于服务器端速率限制并不是很有用。

我正在为已经存在的东西寻找建议,否则我需要基于一些简单的持久性来推出自己的建议,例如绑定到每个 IP 地址的DB_File 和一些执行令牌管理的批处理作业。

【问题讨论】:

    标签: perl cgi throttling


    【解决方案1】:

    我使用Cache::FastMmap 通过跟踪每个 IP 地址的命中来限制速率。它是一个缓存,因此数据会随着时间的推移而过期,但如果您正确设置大小和过期时间,这应该不是问题。

    IP 地址是哈希键,哈希值是时间戳数组。我有第二个数据结构(也由Cache::FastMMap 支持),它是禁止 IP 地址的哈希,根据第一个结构中的数据进行更新。

    【讨论】:

    • 我已经让 Cache::FastMmap 条目在它们的过期时间之前过期,并且在缓存已满之前(这都是关于页面的)。考虑到这一点,我会改用 BDB,并手动使过时的记录过期。
    • 好吧,我决定使用 Cache::FastMmap 是出于性能和并发访问的原因,并且因为不需要 strict 速率限制。后者似乎适用于此,我不知道前者。
    【解决方案2】:

    我知道这不是您所要求的,但是您是否考虑过在堆栈中已经为您完成的其他地方处理此问题?显然我不知道您的部署堆栈,但如果是 apache,您可以使用 mod_evasive。或者,如果你在 Linux 上,你可以让 iptables 使用类似的东西来完成它的工作:

    #Allow only 12 connections per IP
    /sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset
    

    当然更复杂的规则是可能的。

    【讨论】:

    • 我无权访问服务器配置 - 它是共享主机,所以我需要应用程序级别来处理它,在这种情况下是 perl,因为这是我编写的。
    • 我正在查看我的 fastCGI API 的速率限制选项。我认为 mod_evasive 是理想的解决方案,但是我发现该模块在脚本请求(非浏览器)方面存在问题。似乎 mod_evasive 每秒有效,但不会在第二秒内主动工作。即,如果做得足够快,您可以超过 DOSPageInterval 和 DOSSiteInterval 请求限制。由于这些原因,我正在寻找替代解决方案。只是给好奇地寻找 mod_evasive 的人的便条
    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多