一些机器人(例如 claudebot)通过以每秒高请求率索引内容来减慢我们的服务器速度。

我不想禁止它们。我正在寻找一种方法来减慢 Apache 的速度。

我尝试像这样使用 ratelimit:

<If "%{HTTP_USER_AGENT} =~ /claudebot/">
     <Limit GET POST>
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 10
        SetEnv rate-limit-burst 5
        SetEnv rate-limit-delay 500
    </Limit>
</If>  

但它似乎效率不高。

我找到了使用 libapache2-mod-evasive 的方法,可以防止 DOS 攻击,并且如果速率较高则可以阻止 IP。

是否可以为指定的用户代理激活 mod-evasive?


最佳答案
1

影响您的不是索引部分,而是抓取部分。我相信 mod_ratelimit 限制的是带宽而不是资源使用量 – 通过人为地限制流量,您会使每个请求的时间更长,从而加剧对服务器的影响。

如果是我,并且假设这里的目标是仍然允许抓取但仅限制速率,我会使用 fail2ban 来检测高机器人流量,并使用某种机制切换到在超出阈值时以 429 响应的 HTTP 端点。

(例如,某些机制可能是将 iptables 重定向到在不同端口上运行的 vhost,或者将 .htaccess 文件定义为一组 iP 地址的行为)。