mod_evasive 无法在 Apache 2.4.6 上运行

mod_evasive not working on Apache 2.4.6

我正在尝试为 CentOS 7.5.1804 版的 Apache 2.4.6 配置 mod_evasive。我全新安装了 CentOS,全新安装了 Apache,没有提供任何页面或任何东西(只是示例 index.html saying hello world),并且我使用本教程安装了 mod_evasive:https://www.digitalocean.com/community/tutorials/how-to-protect-against-dos-and-ddos-with-mod_evasive-for-apache-on-centos-7

一切正常,除非我必须 运行 测试脚本应该向服务器发送请求并由于 mod_evasive 而出现 403 错误。相反,我收到 400 Bad Request。

我为 IPtables 切换了 firewalld,并且打开了端口 80,事实上,示例页面在浏览器中运行正常。此外,SELinux 模式设置为宽容。

有什么建议吗?

几天后,我发现mod_evasive提供的测试脚本有错误...

我修正了一下,发现安装没问题

您很可能必须更改 perl 脚本(通常保存在 /usr/share/doc/libapache2-mod-evasive/examples/test.pl 中)才能使此工作正常进行,例如

原文:

print $SOCKET "GET /?$_ HTTP/1.0\n\n";

重新处理的行:

print $SOCKET "GET /?$_ HTTP/1.0\r\nHost: 127.0.0.1\r\n\r\n";

来自https://centosfaq.org/centos/apache-mod_evasive-problem-with-testpl/

问题不在于 mod_evasive 或其配置。在我的例子中,我必须调整 mpm_prefork_module 的配置,如下所示,以使 mod_evasive 配置正常工作:

StartServers             10
MinSpareServers          10
MaxSpareServers          10
MaxRequestWorkers        80
MaxConnectionsPerChild   0

基本上通过设置StartServers = MinSpareServers = MaxSpareServers = {your_magic_number}和设置MaxConnectionsPerChild=0将服务器数量固定为常量,这样就不会产生新的服务器进程,也不会发生连接的重新循环,从而让Child无限持有许多并发连接。

希望这对您有所帮助!