如何为Perl Web服务实现服务器端速率限制?
问题描述:
我有一个基于Perl的CGI/Fast CGI Web服务,并希望通过IP地址对客户端进行速率限制,以阻止积极的客户端导致太多工作。如何为Perl Web服务实现服务器端速率限制?
我查找了一些代码,发现在CPAN中有Algorithm::TokenBucket,但是这是针对客户端请求的;它没有持久性,并且没有每个用户的配置,所以对服务器端速率限制并不是很有用。
我正在寻找对已存在的东西的建议,否则我需要根据一些简单的持久性来推出我自己的产品,例如每个IP地址的DB_File以及执行令牌管理的一些批处理作业。
答
我已经使用Cache::FastMmap来限制每个IP地址的点击次数。这是一个缓存,所以数据将随着时间的推移而过期,但如果您设置了正确的大小和过期时间,这应该不成问题。
IP地址是散列键,散列值是时间戳的数组。我有第二个数据结构(也支持Cache::FastMMap),它是禁止IP地址的散列,根据第一个结构的数据进行更新。
答
我知道这不是你问的问题,但你有没有考虑在堆栈中的其他地方处理它已经为你完成的?显然,我不知道你的部署堆栈,但如果它是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
肯定更复杂的规则是可能的。
我有缓存:: FastMmap过期条目的方式之前,他们的过期时间,以及方式之前缓存已满(这是所有关于页面)。考虑到这一点,我会使用BDB,并手动过期陈旧的记录。 – jrockway 2009-02-02 00:29:35
那么,我已经决定Cache :: FastMmap的性能和并发访问的原因,因为*严格*速率限制不是必需的。后者似乎适用于这里,我不知道前者。 – kixx 2009-02-02 08:30:15