我正在运行 Apache 网络服务器,我想为每个单独的 IP 地址添加一些简单的速率限制。
我目前收到似乎有很多机器人请求访问网站,这稍微减慢了正常请求的速度。
我希望能够添加速率限制以减慢机器人的速度,同时又不妨碍 googlebot 的抓取。我猜大约每个 IP 每小时 20,000 个请求应该可以做到这一点,可能更少。
无论如何,为 Apache 添加速率限制的最简单的方法是什么?
到目前为止我发现了几个选择:
mod_security
mod_evasive
mod_ratelimit
mod_limitpconn
但似乎没有一个明确的、明显的解决方案。
或者,使用 Nginx 作为反向代理(并使用内置的速率限制)似乎是另一个可行的选择。它看起来比我迄今为止为 Apache 找到的更容易实现。尽管如果我缺少一个简单的解决方案,我更愿意只使用 Apache。
Fail2Ban 似乎是另一个简单的解决方案,但我不确定429
当访问者达到速率限制时是否可以使用它来返回响应代码。
你会推荐什么?
mod_evasive
我发现
mod_evasive
这是简单速率限制最简单、最有效的解决方案。它的设置比我想象的要容易,而且它是我在 Apache 的所有选项中找到的最佳解决方案(而不是费力地设置 Nginx 作为反向代理)。
这是该 mod 的 repo:
https://github.com/jzdziarski/mod_evasive
另外,还有一个稍微更新的分支,它允许您返回响应代码
429
(而不是503
原始版本)。这更适合让 Google 等机器人知道它们已达到您的速率限制,并相应地调整其抓取速率:https://github.com/jvdmr/mod_evasive
我选择了第二种选择。
安装
可以使用以下方式下载并安装该模块:
您可以使用以下方法检查它是否已安装:
配置
在虚拟主机配置文件中使用以下配置(例如
/etc/apache2/sites-available/000-default.conf
)开始:如果有人在 1 秒内请求同一页面10 次,或者在 5 秒内在整个网站上发出 50 次请求,则将返回 429 响应代码。根据需要调整这些数字。
然后它们将被阻止20 秒。您可以设置一个相当小的阻止时间,因为如果它们在仍然被阻止的情况下发出进一步的速率限制请求,此时间将继续延长。
此链接解释了配置设置:https://www.linode.com/docs/guides/modevasive-on-apache/
跑步
保存配置后,只需重新启动 Apache:
然后,您可以通过以下方式检查最近被禁止的 IP
syslog
(我不相信 mod_evasive 禁止的 IP 被写入它们自己的文件中):到目前为止,它运行良好,而且据我发现,它是Apache 中所有可用的按 IP 进行简单速率限制的选项中最好的模式。