Webench是一款轻量级的网站测压工具,最多可以对网站模拟3w左右的并发请求,可以控制时间、是否使用缓存、是否等待服务器回复等等,且对中小型网站有明显的效果,基本上可以测出中小型网站的承受能力。
WebBench官网:http://home.tiscali.cz/~cz210552/webbench.html
测试环境说明:需要有两台服务器(A和B),在A服务器上上安装WebBench工具,对B服务器的网站进行测试。
WebBench安装
WebBench使用
webbench -c 并发数 -t 运行测试时间(秒) URL
通过测试,在A服务器执行webbench命令后,B服务器的CPU飙升至90%,同时B服务器操作卡顿,B服务器上的网站也打不开了。通过观察nignx日志,发现大量的并发请求:
如何防止短时间的大量并发导致服务器宕机。
解决办法:
控制并发数,控制请求频率,必要时fail2ban
控制并发数及请求频率
修改nginx配置,做如下设置:
重启nginx,重新进行测试,测试结果发现A服务器的请求响应都变成了503:
说明在nginx层面,已经拒绝了大量的并发请求。但尽管如此,服务器的CPU依然占用很高,网站依然打开缓慢。
安装fail2ban
检查Firewalld是否启用
fail2ban可以监控系统日志,并且根据一定规则匹配异常IP后使用Firewalld将其屏蔽,尤其是针对一些爆破/扫描等非常有效。
安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。
配置规则
新建jail.local来覆盖fail2ban的一些默认规则:
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口
监控nginx访问日志
这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。
继续修改vi /etc/fail2ban/jail.local追加如下内容:
上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。
常用命令
如果启动fail2ban报错
如果是在centos6.5上,启动fail2ban时有可能会报错,例如:
有可能你升级过python的版本导致的,需要修改/usr/bin/fail2ban-client和/usr/bin/fail2ban-server这两个文件的第一行
不起作用原因
正常情况,按照默认设置,如果我们一分钟内访问20次网页,就会被拉入黑名单,不允许访问了,如果经测试发现不起作用,可以通过如下办法来测试
测试匹配规则
通过如下命令可以测试日志的匹配规则是否被命中
检查fail2ban-python
通过以上截图可以看到fail2ban-python是软链接到/usr/bin/python程序的,如果你是centos6.5且自己升级过python,那么需要重新设置下软链接
重新设置软链接
使用CDN后获取真实IP地址
使用CDN后,通过日志可以看到IP都不是真实的,二是CDN的IP地址,如果继续屏蔽IP,只会把CDN的IP给屏蔽掉,而我们希望获取的是真实的IP地址。
修改nginx配置文件,在http模块中添加如下代码:
然后在每个站点的配置文件中,在access_log后面加上main参数。例如宝塔的nginx站点配置文件是在:
那么需要打开站点配置文件,在里面的access_log后面加上main参数。例如:
同时,还需要修改之前的控制并发数及请求频率参数:
重启nginx,然后再次观察日志文件,可以看到记录的IP是真实的IP了。
参考文章:
Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法:https://zhang.ge/4879.html
CentOS 7安装fail2ban + Firewalld防止爆破与CC攻击:https://www.xiaoz.me/archives/9831