欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用MongoDB分析Nginx日志的方法詳解

 更新時間:2017年01月25日 10:51:47   投稿:daisy  
在項目開發(fā)過程中,總是離不開日志解析的工作,雖然有些時候覺得確實挺繁瑣的,但是靜下心來會發(fā)現(xiàn)有時候也是挺有趣的1件工作。 下面這篇文章主要介紹了使用MongoDB分析Nginx日志的方法,需要的朋友可以參考借鑒,一起來看看吧。

本文我們要從日志文件中找出IP訪問最多的10條記錄,然后判斷其是否合法,從而采取對應(yīng)的措施。感興趣的朋友們一起來看看吧。

日志解析流程

正常情況下,關(guān)于Nginx日志解析的流程如下所示:

一般情況下我們會對要解析的日志提前進行切分,常用的方式是按照日期,然后保存1個星期的日志。然后接下來就是日志的解析了,在這個過程中會使用到一些工具或編程語言,例如awk、grep、perl、python。

最后的入庫和可視化處理一般視業(yè)務(wù)而定,沒有強制的要求。

日志查詢的解決方案

而關(guān)于Nginx日志解析的常用解決方案主要有如下4種方式:

  1. 通過awk和grep進行解析
  2. 通過Postgresql外聯(lián)表進行日志的映射
  3. 通過Python與MongoDB的組合來進行日志查詢
  4. 通過ELK這個開源套件進行查詢

其中Postgresql外聯(lián)表的方式在之前公司的時候已經(jīng)使用過,當(dāng)然是對公司多個3GB大小的日志進行處理。而第1種和第4種解決方案沒有太多的實踐的經(jīng)驗,這里我們主要來看第2種解決方案。

日志格式

關(guān)于日志解析處理,我們比較常用的方式是使用正則表達式來進行匹配,而常用的1個庫是nginxparser,我們可以直接通過pip進行安裝。當(dāng)然還有其他的方式來進行解析,這個要視業(yè)務(wù)而定。

在日志解析中,比較重要的是日志的格式,默認情況下Nginx的日志格式如下:

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
     '$status $body_bytes_sent "$http_referer" ' 
     '"$http_user_agent" "$http_x_forwarded_for"' 
     '$upstream_addr $upstream_response_time $request_time; 

下面我們來看實際業(yè)務(wù)中的1個應(yīng)用。之前公司有1個搶微信紅包的活動,當(dāng)然有用戶反映好幾天都無法搶到1個紅包。因此,我們團隊成員認為可能在這個過程中存在作弊的現(xiàn)象,因此便決定對Nginx的日志進行解析。

下面是1條真實的日志的記錄:

101.226.89.14 - - [10/Jul/2016:07:28:32 +0800] "GET /pocketmoney-2016-XiKXCpCK.html HTTP/1.1" 302 231 "-" "Mozilla/5.0 (Linux; Android 5.1; OPPO R9tm Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036548 Safari/537.36 MicroMessenger/6.3.22.821 NetType/WIFI Language/zh_CN" 

日志分析

通過awk進行解析

接著,我們來看下如何使用awk解析出IP訪問最多的記錄,關(guān)于awk語法可以參考進行學(xué)習(xí):

dog@dog-pc:~$ awk '{a[$1]++}END{for(i in a)print i,a[i]}' nginx.log |sort -t ' ' -k2 -rn|head -n 10 
111.167.50.208 26794 
183.28.6.143 16244 
118.76.216.77 9560 
14.148.114.213 3609 
183.50.96.127 3377 
220.115.235.21 3246 
222.84.160.249 2905 
121.42.0.16 2212 
14.208.240.200 2000 
14.17.37.143 1993 

默認情況下,awk以空格作為分隔符號,因此$1將獲取到Nginx默認格式中的遠程地址。在這里,我們通過定義1個字段,使用IP作為鍵名,如果對應(yīng)的鍵名存在則將其數(shù)量加1處理。最后我們遍歷這個字典,之后通過數(shù)量進行排序,最后通過head獲取10條記錄。
當(dāng)然這種操作方式是有較大誤差的,因為我們沒有指定狀態(tài)碼等其他條件,下面我們來看根據(jù)狀態(tài)碼和請求方式這2個條件后過濾的數(shù)據(jù):

dog@dog-pc:~$ awk '{if($9>0 && $9==200 && substr($6,2)== "GET") a[$1]++}END{for(i in a)print i,a[i]}' nginx.log|sort -t ' ' -k2 -rn|head -n 10 
222.84.160.249 2856 
183.28.6.143 2534 
116.1.127.110 1625 
14.208.240.200 1521 
14.17.37.143 1335 
219.133.40.13 1014 
219.133.40.15 994 
14.17.37.144 988 
14.17.37.161 960 
183.61.51.195 944 

這樣我們就可以將這10個IP進行分析,考慮下一步的操作,比如通過iptables組合禁止該IP的訪問或限制其訪問的次數(shù)等。

通過Postgresql

通過Postgresql入庫后使用SQL進行查詢的方式可以通過如下2種圖片來查看:

在上圖中主要是查看日志中請求狀態(tài)碼的總數(shù)量。而下圖是對狀態(tài)碼為200的前10條IP的篩選:

可以看到基本上與上面awk解析的方式一致。

通過MongoDB進行查詢

我們知道,MongoDB是1個文檔型數(shù)據(jù)庫,通過這個數(shù)據(jù)庫我們輔助解決關(guān)系型數(shù)據(jù)庫一些不太擅長的工作。

在Python中,主要的MongoDB客戶端驅(qū)動是PyMongo,我們可以通過如下的方式建立1個連接:

In [1]: from pymongo import MongoClient 
In [2]: client = MongoClient()

由于這里我們使用的是默認的端口和地址,因此在MongoClient類中不傳入任何的參數(shù)。

在這里,我們先說下我們插入到MongoDB中日志的格式:

{ 
 "status": 302, //HTTP狀態(tài)碼 
 "addr": "101.226.89.14", //遠程IP地址 
 "url": "-", 
 "req": "/pocketmoney-2016-XiCXCpCK.html", //請求的地址 
 "agent": "Mozilla/5.0 (Linux; Android 5.1; OPPO R9tm Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036548 Safari/537.36 MicroMessenger/6.3.22.821 NetType/WIFI Language/zh_CN", //請求的user-agent 
 "referer": "NetType/WIFI", 
 "t": "2016/07/10 06:28:32", //請求的時間 
 "size": 231, //響應(yīng)的大小 
 "method": "GET", //請求的方法 
 "user": "-" //用戶名稱 
} 

在這里我們通過Python進行解析后,組裝成如上的格式后插入到MongoDB中,在這里主要用到的是MongoDB文檔對象的insert_one方法插入1條記錄。

db = client['log'] 
col = db['nginx'] 
data = {} 
... 
col.insert_one(data)

接著我們開始對上述的記錄進行查詢操作,主要是通過MongoDB提供的map-reduce來實現(xiàn)聚合操作,其對應(yīng)的Python代碼為:

In [3]: db = client['log'] 
In [4]: col = db['nginx'] 
In [5]: pipeline = [ 
 ...: {"$match":{"status":200}}, 
 ...: {"$group":{"_id":"$addr","count":{"$sum":1}}}, 
 ...: {"$sort":{"count":-1}}, 
 ...: {"$limit":10} 
 ...: ] 
In [6]: list(col.aggregate(pipeline)) 
Out[6]: 
[{u'_id': u'222.84.160.249', u'count': 2856}, 
 {u'_id': u'183.28.6.143', u'count': 2534}, 
 {u'_id': u'116.1.127.110', u'count': 1625}, 
 {u'_id': u'14.208.240.200', u'count': 1521}, 
 {u'_id': u'14.17.37.143', u'count': 1335}, 
 {u'_id': u'219.133.40.13', u'count': 1014}, 
 {u'_id': u'219.133.40.15', u'count': 994}, 
 {u'_id': u'14.17.37.144', u'count': 988}, 
 {u'_id': u'14.17.37.161', u'count': 960}, 
 {u'_id': u'183.61.51.195', u'count': 944}]

可以看到這個過程與之前的2種方式得到的結(jié)果是一致的。

關(guān)于可視化處理

關(guān)于可視化處理,我們可以選擇一些Javascript的庫,例如:

  1. 百度的Echarts
  2. d3.js及其衍生的庫

對于Python,可視化處理可以使用如下的一些庫:

  1. matplotlib
  2. pandas

當(dāng)然還有一些其他的庫這里就不一一敘述了。

下面是1個使用百度Echart繪制的界面:

看起來還是挺漂亮的。

參考文章:http://api.mongodb.com/python/current/examples/aggregation.html

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • Nginx 運維之域名驗證的方法示例

    Nginx 運維之域名驗證的方法示例

    這篇文章主要介紹了Nginx 運維之域名驗證的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • nginx?如何配置文件上傳大小

    nginx?如何配置文件上傳大小

    這篇文章主要介紹了nginx?如何配置文件上傳大小,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • nginx-ingress-controller部署配置詳解

    nginx-ingress-controller部署配置詳解

    這篇文章主要為大家介紹了nginx ingress controller的部署配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Nginx 根據(jù)URL帶的參數(shù)轉(zhuǎn)發(fā)的實現(xiàn)

    Nginx 根據(jù)URL帶的參數(shù)轉(zhuǎn)發(fā)的實現(xiàn)

    這篇文章主要介紹了Nginx 根據(jù)URL帶的參數(shù)轉(zhuǎn)發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Nginx + Tomcat實現(xiàn)請求動態(tài)數(shù)據(jù)和請求靜態(tài)資源的分離詳解

    Nginx + Tomcat實現(xiàn)請求動態(tài)數(shù)據(jù)和請求靜態(tài)資源的分離詳解

    這篇文章主要給大家介紹了關(guān)于Nginx + Tomcat實現(xiàn)請求動態(tài)數(shù)據(jù)和請求靜態(tài)資源的分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Nginx獲取客戶端真實IP(real_ip_header)的實現(xiàn)

    Nginx獲取客戶端真實IP(real_ip_header)的實現(xiàn)

    在使用Nginx作為反向代理時,確保獲取客戶端真實IP是關(guān)鍵,通過配置real_ip_header和set_real_ip_from,Nginx可以正確解析X-Forwarded-For頭部信息,并更新$remote_addr為客戶端真實IP,下面就來具體介紹一下
    2024-10-10
  • 詳解Nginx與Apache共用80端口的配置方法

    詳解Nginx與Apache共用80端口的配置方法

    這篇文章主要介紹了Nginx與Apache共用80端口的配置方法,當(dāng)然如果想Nginx不與Apache搶80端口的話,本文后面也附帶了Nginx的端口修改方法,需要的朋友可以參考下
    2016-01-01
  • Nginx中的root&alias文件路徑及索引目錄配置詳解

    Nginx中的root&alias文件路徑及索引目錄配置詳解

    這篇文章主要介紹了Nginx中的root&alias文件路徑及索引目錄配置,順帶講解了root和alias命令的用法,需要的朋友可以參考下
    2016-01-01
  • Nginx if語句加正則表達式實現(xiàn)字符串截斷

    Nginx if語句加正則表達式實現(xiàn)字符串截斷

    這篇文章主要介紹了Nginx if語句加正則表達式實現(xiàn)字符串截斷功能,特殊場合下可能會需要這個功能,NGINX的奇淫技巧之一,需要的朋友可以參考下
    2015-02-02
  • Nginx IP限制與路徑訪問控制配置

    Nginx IP限制與路徑訪問控制配置

    在某些應(yīng)用場景下,特定路徑需要免登錄訪問,本文主要介紹了Nginx IP限制與路徑訪問控制配置,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評論