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

 

posted @ 2018-03-16 15:29  IT菜鸟园  阅读(4717)  评论(0编辑  收藏  举报