动态阻止高流量站点中的IP:最佳策略?

时间:2011-11-03 13:58:59

标签: php performance apache

我有一些糟糕的机器人瞄准我的网站,我需要动态处理这些机器人来自的IP地址。这是一个非常高流量的网站,我们每天获得数百万的网页浏览量,这就是我们使用4台服务器(loadbalanced)的原因。我们不使用任何缓存(除了资产),因为我们的大多数响应都是唯一的。

代码 - 技术上它是一个非常小的PHP网站,它不会对每次网页浏览进行数据库查询和一次XML请求。 XML请求得到了一个很好的快速响应。

我已经开发了一个脚本(非常频繁地)分析哪些IP地址正在执行滥用请求,并且我希望在一定时间内以不同方式处理来自这些IP的请求。滥用的IP变化很大,因此我需要每隔几分钟阻止不同的IP

所以:我看到IP xx.xx.xx.xx是滥用的,我把它记录在某个地方,然后我想给它IP请求下一个x分钟的特殊处理。我需要以快速的方式做到这一点,因为我不想放慢服务器的速度,让合法用户为此受苦。

解决方案1:文件

将滥用的IP写入文件,然后为每个请求读取该文件 太慢了。你同意吗?

解决方案2:PHP包括

我可以让我的分析脚本编写一个PHP包含文件,然后PHP引擎将为每个请求包含该文件。但是:我可以想象,在编写PHP文件时,很多用户发出请求然后会因为文件被使用而出错。

我可以通过编写文件然后进行符号链接更改(可能更快)来解决这个潜在的问题。

解决方案3:htaccess

将滥用者分开的另一种方法是编写阻止或重定向它们的htacces。这可能是最有效的方法,但我需要每x分钟编写一个htaccess文件。

我很想听听我提出的解决方案的一些想法/反应,特别是关于速度的问题。

3 个答案:

答案 0 :(得分:1)

如何动态配置iptables来阻止坏IP?我认为没有理由在PHP中进行“防火墙”...

答案 1 :(得分:1)

为了记录我最终决定选择(我自己建议的)第2号解决方案,生成一个包含在每个页面请求中的PHP文件。

完整的解决方案如下: Python脚本每x分钟分析一次accesslog文件,并对某些IP地址发出“惩罚”。所有当前运行的惩罚都写入一个相当小(<1Kb)的PHP文件中。每个页面请求都包含此PHP文件。在生成PHP文件之后,就会启动rsync作业,将新的PHP文件推送到负载均衡器后面的其他3个服务器。

在生成PHP文件的Python脚本中,我首先连接文件的完整内容。然后我按顺序打开,写入和关闭文件,以便在最短的时间内锁定文件。

答案 2 :(得分:0)

我会认真考虑建立另一台服务器来保存内存中的(不断变化的)阻止列表,并为前端服务器提供服务。 我使用Node.JS实现了这样的解决方案,发现实现简单,性能非常好。 也可以使用memcached,但我从未尝试过。