如何防止或减少由机器人引起的 Apache 负载峰值

如何防止或减少由机器人引起的 Apache 负载峰值

今天,我们的一台共享 Web 服务器上的 MySQL 被 oom-killer 杀死,导致我们的客户无法使用。当我调查发生了什么时,我发现在 20 秒内来自一个 IP 地址的请求超过 1,300 个。它们访问了服务器上的每个 vhost,这意味着必须为每个站点启动 PHP-FPM,这反过来又导致了 OOM 情况。我将调整 oom-killer,以避免它在未来杀死 MySQL,但这不是这个问题的目的。

我想知道的是,未来是否有合理的方法来检测这种情况。没有机器人需要每秒发出 66 个以上的请求,尤其是在多个虚拟主机之间。感觉应该可以检测到流向多个虚拟主机的流量突然大幅增加,并采取适当的措施来阻止它们。

我们已经实施了 fail2ban,但这似乎并不真正属于其职权范围,而且我当然看不出使用该工具实施检查的合理方法,这种方法不会冒着阻止合法蜘蛛跨越虚拟主机而不导致问题的风险(例如 Google Bot 和 Bing Bot)。我们还在 Web 服务器前面使用 Varnish 来减轻 Apache 的负担,从那里我们阻止已知的恶意机器人 UA 和其他来自机器人的提示。但这个机器人使用标准的 Microsoft Edge UA 来标识自己,除了每秒发出大量请求这一事实外,其他方面看起来都是合法的。如果有必要,我们还可以在国家/地区级别阻止 IP,但除非绝对必要,否则我们极不愿意这样做,因为我们的客户遍布全球。这个特定的 IP 在加拿大,我们当然无法禁止它。

我知道 Apache Rate Limiter mod,之前在旧服务器上也实施过,但我们遇到过问题,除非我们设置极其宽松的选项,否则它会限制合法用户,而机器人会利用这些选项,让它变得毫无价值。我们还将托管服务器的速度作为卖点,所以我不想设置任何会减慢合法用户浏览速度的设置。

欢迎提出任何建议,因为我觉得我不是第一个对这个问题感到恼火的人,但我在网上找不到任何特别有用的东西。

相关内容