如何为Perl Web服务实现服务器端速率限制?

问题描述:

我有一个基于Perl的CGI/Fast CGI Web服务,并希望通过IP地址对客户端进行速率限制,以阻止积极的客户端导致太多工作。如何为Perl Web服务实现服务器端速率限制?

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

我正在寻找对已存在的东西的建议,否则我需要根据一些简单的持久性来推出我自己的产品,例如每个IP地址的DB_File以及执行令牌管理的一些批处理作业。

我已经使用Cache::FastMmap来限制每个IP地址的点击次数。这是一个缓存,所以数据将随着时间的推移而过期,但如果您设置了正确的大小和过期时间,这应该不成问题。

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

+0

我有缓存:: FastMmap过期条目的方式之前,他们的过期时间,以及方式之前缓存已满(这是所有关于页面)。考虑到这一点,我会使用BDB,并手动过期陈旧的记录。 – jrockway 2009-02-02 00:29:35

+0

那么,我已经决定Cache :: FastMmap的性能和并发访问的原因,因为*严格*速率限制不是必需的。后者似乎适用于这里,我不知道前者。 – kixx 2009-02-02 08:30:15

我知道这不是你问的问题,但你有没有考虑在堆栈中的其他地方处理它已经为你完成的?显然,我不知道你的部署堆栈,但如果它是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 

肯定更复杂的规则是可能的。