脚本的大体实现思路: 过滤最近30分钟的日志,通过去重,过滤出访问网站的客户ip,在30分钟内访问某些接口超过500次的,自动写到black_ip文件里。nginx使用deny ip; 的方式拒绝提供服务。 因为日志没有做切割,所以使用tail -n 40000 的方式获取最近30分钟的日志,由于我们网站的日志量不是很大,我过滤的40000行的数据完全覆盖了最近30分钟的日志数据。需要注意。 还有就是这台服务器上运行着多个网站,所以用了一个for循环,生成每个网站的black_ip文件。 #!/bin/bash date_Y_m_d=`date +%Y-%m-%d` date_30m_ago=`date -d '30 minute ago' +%H:%M` date_now=`date +%H:%M` log_path='/var/logs/xxx/access' log_file=$(ls *.log) black_ip_file=/usr/local/nginx/conf/black_ip_file tmp_black_ip=/tmp/black_ip.log black_ip_all=/usr/local/nginx/conf/black_ip_all.conf nginx_cmd=/usr/local/nginx/sbin/nginx cd ${log_path} for i in $log_file;do tail -n 40000 $i|egrep 'api|apis|app|web' |sed -n "/${date_Y_m_d}T${date_30m_ago}/,/${date_Y_m_d}T${date_now}/p" | jq .client|awk '{ip[$1]++}END{for (i in ip) print ip[i],i}'|awk '{if ($1 > 500) print "deny "$2";" }' |tee ${tmp_black_ip} project_name=$(echo $i|awk -F '.' '{print $1}') ## 留存记录,定期检查大于1000 的ip 放入iptables里永久拒绝 cat ${black_ip_file}-${project_name}.conf >> ${black_ip_all} grep -v -f ${black_ip_file}-${project_name}.conf ${tmp_black_ip} |tee ${black_ip_file}-${project_name}.conf done ##重启nginx ${nginx_cmd} -s reload (责任编辑:IT) |