線上nginx訪問日誌匹配處理及nginx限流簡單處理

今天部門開會提到了個問題,惡意刷接口怎麼處理?就當做是一個作業,去學會如何簡單的分析nginx日誌。
 
1 先看nginx日誌
# whereis nginx      //找到nginx目錄位置
 
 
 
2 進入訪問日誌目錄,這裏可以看到是access.log文件
# cd /etc/nginx/logs
 
 
 
3 對當前訪問日誌進行ip訪問次數分析(分析每個ip的訪問次數和訪問次數降序排序)
 這裏的nginx日誌格式如下(取一條做示例):
http 172.16.82.102 [06/Jan/2020:21:03:13 +0800] "GET /index/todo/count.json HTTP/1.1" 200 62 "http://xxx.xxx.xxxx.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/5        37.36" 0.005 0.005 cookieOpenId=-
 
匹配文件的命令如下:
# cat /etc/nginx/logs/access.log | grep "06/Jan/2020" |awk '{print $2,'\t',$6}' |sort -r | uniq -c | sort -k 1 -n -r| head -10
說明:上面規則很簡單,首先cat拿到對應文件內容,然後用grep "06/Jan/2020" 過濾得到今天的訪問日誌。然後awk拿到第二個文字內容(這裏是ip,一個 就是表示一個下標,即$2對應172.16.82.182),然後就是排序sort,uniq -c去重,head -10取前面十條
 
 
從上面可見10.60.7.187的訪問次數最多,假設這是個惡意訪問的,那就可能是幾十萬次,這時候我們可以修改對應的nginx配置來限制這個ip的問題。
 
4 nginx限流ip訪問配置
第一種方法:限制單個ip的訪問評率
1 在nginx的http模塊中添加以下配置
limit_req_zone $binary_remote_addr zone=query:10m rate=1r/s;
說明: rate=1r/s 的意思是每個地址每秒只能請求一次
 
2 在server模塊中添加一下配置
    location ~ /loan/query {
        limit_req zone=req_one burst=5;
        proxy_pass http://myapp;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
說明:burst是指一共有5個令牌,發完後,只能根據rate的設定每秒新增一個,reload nginx的配置之後,再次查看日誌。可以看到訪問頻率明顯降下來了
 
第二種方法:禁用掉訪問頻率超高的那個ip
在http、server、location模塊中添加如下:
     deny 10.60.7.187                
 
當然除了nginx限制之外,還可以用網關等做限制。
 
 
 
 
 
發佈了171 篇原創文章 · 獲贊 730 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章