如何仅为单个Apache2虚拟主机启用Mod_Evasive?
解决Mod_Evasive仅针对单个Apache虚拟主机生效的问题
我完全懂你这个困扰——Mod_Evasive确实是全局加载的模块,官方文档里确实没提供直接按虚拟主机启用/禁用的开关,不过你提到的「默认参数拉满+特定站点单独配置」的思路是可行的,而且是目前社区里最常用的解决方案,我来给你拆解具体操作步骤:
第一步:全局配置“禁用”Mod_Evasive的拦截效果
先在Mod_Evasive的全局配置文件(通常是/etc/apache2/mods-available/mod_evasive.conf,或者直接写在Apache主配置httpd.conf/apache2.conf里),把所有触发阈值设到极高值,让默认情况下完全不会触发拦截或封禁:
# 全局默认配置:将阈值拉到正常访问不可能达到的数值,等同于全局“禁用”防护 DOSHashTableSize 3097 DOSPageCount 10000 # 单页面1秒内请求数阈值,设10000基本不会触发 DOSSiteCount 100000 # 整个站点1秒内请求数阈值 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 0 # 封禁时长设0,即使触发也不会封禁
这样配置后,所有虚拟主机默认都不会受到Mod_Evasive的拦截影响。
第二步:在目标虚拟主机中覆盖参数,启用防护
找到你需要启用Mod_Evasive的虚拟主机配置块(比如/etc/apache2/sites-available/your-domain.conf),在里面添加Mod_Evasive的专属配置,覆盖全局的极高阈值:
<VirtualHost *:80> ServerName your-target-domain.com DocumentRoot /var/www/your-target-domain # 其他虚拟主机常规配置(比如日志、SSL设置等)... # 针对该站点启用Mod_Evasive防护,设置正常的防护阈值 DOSPageCount 20 # 1秒内单页面请求超过20次触发拦截 DOSSiteCount 100 # 1秒内整个站点请求超过100次触发拦截 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 600 # 触发后封禁10分钟(600秒) DOSLogDir "/var/log/apache2/mod_evasive" # 日志目录,需确保Apache有读写权限 DOSEmailNotify "admin@your-target-domain.com" # 触发拦截时发送通知邮件 </VirtualHost>
如果你的站点启用了HTTPS,记得在对应的<VirtualHost *:443>块里也添加同样的Mod_Evasive配置,不然HTTPS请求不会被防护。
关键注意事项
- 确保
DOSLogDir指定的目录存在,并且Apache进程拥有读写权限,否则Mod_Evasive可能会抛出错误导致站点无法正常运行,可以用命令创建并授权:mkdir -p /var/log/apache2/mod_evasive && chown www-data:www-data /var/log/apache2/mod_evasive - 测试防护效果可以用Apache自带的
ab命令模拟高频请求:ab -n 30 -c 10 http://your-target-domain.com/,此时目标站点应该会返回403被封禁,而访问其他虚拟主机的相同请求则不受影响 - 如果你有多个需要防护的虚拟主机,只需要在对应的每个虚拟主机配置块里重复上述参数配置即可
为什么没有更直接的方法?
Mod_Evasive的设计本身就是全局模块,它没有提供类似EnableModEvasive On/Off的虚拟主机级开关,所以通过参数覆盖的方式是目前最稳妥的实现方案,也是社区里广泛采用的做法。
内容的提问来源于stack exchange,提问作者karnehe
相关产品推荐
相关产品推荐

