前端負載一臺,做用是客戶端發起一條http請求到前端負載均衡服務器,而後負載層根據web server已定義的輪詢算法,把各消息原封不動的轉發到後段的各web server上,壓力這塊不是很大,由於都轉到後端了。
可是有個問題,客戶端在發起一條http請求到前端負載層的時候,一分鐘內這個請求數會達到驚人的幾十萬條不等(項目業務須要,客戶端自身須要把金額等數據同步到各項目服務器上),基本是客戶端對服務端發起的同步請求,還有其它的對web站點的訪問請求。而後可能有些同步請求不是必須也不須要那麼頻繁或者是在這個時間內根本不須要把數據同步上來。固鑑於此就想着看能不能在前端負載層作個併發控制,對這個傳過來的客戶端IP作個操做。當這個IP請求次數大於內部設定的某個值的時候就讓它拒絕訪問服務器,這樣的話服務器在處理消息的時候也會更加有效率,也能起到必定的宮級做用。想了想應該能夠實現,因此纔有了下面的腳本。記錄下來供各位小夥伴參考下......前端
#!/bin/bash #Author:You Names #Contact Mail:455436588@qq.com #Version:3.0 #Company:COMPANY #Create time:2019-07-17 17:31:58 #Description:Nginx server concurrency restrictions Max=100000 CFS=/usr/local/nginx/conf/nginx.conf LOGS=/usr/local/nginx/logs/access.log #執行循環體 #過濾出access.log日誌裏所定義的'$remote_addr'地址。重複的打印出來並排序; cat $LOGS | awk '{print $2}' | sort -n | uniq -c | sort -rn | head -n 10 | while read line do #定義變量$IP,打印出是哪一個IP; IP=`echo "$line" | awk '{print $2}'` #定義變量$Count,打印出這個IP出現的次數; Count=`echo "$line" | awk '{print $1}'` #定義變量$Docs,值爲nginx的配置文件; Docs=${cat $CFS} #定義變量$CFG,看配置文件裏有沒有這個IP; CFG=`echo "$Docs" | grep "${IP}"` #判斷,若是$Count的值大於$Max的值,而且在$CFG裏爲空,不是這也不是那,執行替換並寫入到$Docs指定location下作deny操做,重載並continue; if [[ $Count -gt $Max ]] && [[ $CFG == " " ]] && [[ $IP != "IP ADDRESS" ]] && [[ $IP != "IP ADDRESS" ]] then sed -i '/location \/ {/a\deny '${IP}';' $CFS sed -i '/location \/pads {/a\deny '${IP}';' $CFS sed -i '/location \~\* \\\.ios\$ {/a\deny '${IP}';' $CFS sed -i '/location \~\* \\\.android\*\$ {/a\deny '${IP}';' $CFS /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload && echo "SUCCESS!!" else continue fi done