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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM