nginx 根据url访问次数限制
#获取日期 date=`date +"%y%m%d"` #设置日志路径 data="/data/logs/abc.com/access.log" #配置文件路径 conf="/usr/local/nginx/conf/selfconf/abc.conf" #设置要监控的地址,多个地址用空格隔开,监控全局设为null url='/pub/send/yzm/' #白名单IP Whitelist="1.1.1.1|2.2.2.2" #过滤不计次错误返回值 error_num="403|503" #最大次数 maxnum=100 #判断日志是否为空 if [ -s "$data" ]; then #将每分钟的日志转存到每日日志里去 cat $data >> $data$date #获取要禁的ip for aurl in $url; do #判断是否有设置监控地址,否则全局监控 if [[ "$url"x == "null"x ]]; then echo "grep -Ev $Whitelist|$error_num $data | awk '{print $1}' |sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr | uniq -c |awk -v max=$maxnum '{if($1>max){print $2}}'" deny=`grep -Ev "$Whitelist|$error_num" $data | awk '{print $1}' |sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr | uniq -c |awk -v max="$maxnum" '{if($1>max){print $2}}'` else deny=`awk '{if($7 == "'"$aurl"'"){print $0}}' $data | grep -Ev "$Whitelist|$error_num" | awk '{print $1}' |sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr | uniq -c |awk -v max="$maxnum" '{if($1>max){print $2}}'` fi #判断是否为空 if [[ "$deny"x != ""x ]]; then for adeny in $deny; do sed -i "/server {/a\deny $adeny;" $conf #echo $adeny done #添加日期 sed -i "/server {/a\\\n#$aurl $date" $conf #重启nginx /usr/local/nginx/sbin/nginx -s reload fi done #清空日志 echo '' > $data fi