ELK對nginx日志進行流量監控


ELK對nginx日志進行流量監控

一、前言

     線上有一套ELK單機版,版本為5.2.1。現在想把nginx訪問日志接入到elk里,進行各個域名使用流量帶寬的統計分析。要把nginx日志傳輸到elk上,可以在存有nginx日志的服務器上使用logstash或者filebeat。但是因為logstash是jvm跑的,資源消耗比較大,啟動一個logstash就需要消耗500M左右的內存(這就是為什么logstash啟動特別慢的原因),而filebeat只需要10來M內存資源,所以最終決定使用filebeat。

     filebeat是輕量級日志采集器,能輸送至 Elasticsearch 或 Logstash,在 Kibana 中實現可視化,架構圖如下:

    

 

二、具體部署過程

1、設置nginx日志輸出為json格式

ps:如果不先把nginx日志設為json格式,而是沿用默認的日志輸出格式,則需要利用logstash grok插件對日志字段進行正則匹配。grok表達式的語法來源於Ruby正則,它的主要作用是將文本格式的字符串,轉換為具體的結構化數據,配合正則表達式使用。但是grok是非常耗費CPU資源的,所以最終還是按簡單方式來,把nginx日志設置為json輸出(表示不懂Ruby正則 = =)

     在nginx主配置文件中加入:

 1     log_format json '{"@timestamp":"$time_iso8601",'
 2   '"host":"$server_addr",'
 3   '"clientip":"$remote_addr",'
 4   '"size":$body_bytes_sent,'
 5   '"responsetime":$request_time,'
 6   '"upstreamtime":$upstream_response_time,'
 7   '"upstreamhost":"$upstream_addr",'
 8   '"http_host":"$host",'
 9   '"url":"$uri",'
10   '"xff":"$http_x_forwarded_for",'
11   '"referer":"$http_referer",'
12   '"agent":"$http_user_agent",'
13   '"status":"$status"}';

 

2、日志采集客戶端安裝filebeat

(1)下載filebeat-5.2.2的rpm包並安裝

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm 

sudo rpm -vi filebeat-5.2.2-x86_64.rpm

官方安裝文檔:https://www.elastic.co/guide/en/beats/filebeat/5.2/filebeat-installation.html

 

(2)修改配置文件

vim /etc/filebeat/filebeat.yml

(a)指定paths列表,配置要讀取的nginx日志路徑

注釋默認的paths列表:“- /var/log/*.log”,默認的/var/log/*.log表示將會抓取/var/log子目錄目錄下所有.log文件
添加要讀取的日志路徑

 

b) 配置filebeat輸出到logstash,

注釋輸出到elasticsearch的配置:

 打開logstash的輸出,其中hosts設置為logstash服務器的ip,端口要確保logstash服務器是沒有被占用的

 

(3)啟動filebeat

nohup sh /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml >> /tmp/startfilebeat.log 2>/tmp/startServerError.log &

 

3、配置日志收集引擎logstash

注意:確保已經安裝以下插件(查看:bin/logstash-plugin list)

(1)logstash-input-beats:Beats插件用於建立監聽服務,接收Filebeat或者其他beat發送的Events

(2)logstash-filter-mutate:允許在字段上執行常規突變,包括重命名,刪除,替換和修改事件中的字段

(3)logstash-filter-json:JSON解析過濾器,它接受一個包含JSON的現有字段,並將其擴展為Logstash事件中的實際數據結構。

(4)logstash-filter-geoip:轉換ip為詳細地址(經緯度,具體所屬地區等)

 

(1)編輯logstash配置文件

vim /home/elk/elk5.2/logstash-5.2.1/config/logstash-nginx.conf

 1 input {
 2          beats {
 3              port => 4568
 4              client_inactivity_timeout => 600  #600秒之后關閉空閑的連接
 5         }
 6 }
 7 
 8 filter {
 9       mutate {
10           gsub => ["message", "\\x", "\\\x"]
11           gsub => ["message", ":-,", ":0,"]
12       }
13 
14       json {
15             source => "message"
16             remove_field => "message"
17             remove_field => "[beat][hostname]"
18             remove_field => "[beat][name]"
19             remove_field => "[beat][version]"
20             remove_field => "@version"
21             remove_field => "offset"
22             remove_field => "input_type"
23             remove_field => "tags"
24             remove_field => "type"
25             remove_field => "host"
26       }
27       mutate {
28           convert => ["status", "integer"]
29           convert => ["size","integer"]
30           convert => ["upstreamtime", "float"]
31           convert => ["responsetime", "float"]
32       }
33 
34        geoip {
35             source => "clientip"
36             database => "/home/elk/elk5.2/logstash-5.2.1/config/GeoLite2-City.mmdb"
37             fields => ["city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"] 
38             add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
39             add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
40             target => "geoip"
41         }
42         mutate {
43            convert => [ "[geoip][location]", "float" ]
44          }
45         if "_geoip_lookup_failure" in [tags] { drop { } }
46 }
47 
48 output {
49     elasticsearch {
50         hosts => ["127.0.0.1:9500"]
51         index => "logstash-nginx-xtw"
52     }
53  }

 

說明:

(a)gsub => ["message", "\\x", "\\\x"]

用於兼容中文路徑,數據替換

(b)gsub => ["message", ":-,", ":0,"]

Nginx日志有些字段輸出為空時用“-”表示,json會解析不到,所以轉換為0

(c)source => "message"

從filebeat數據中取出message

(d)remove_field 

刪除kibana頁面展示的多余字段

(e)mutate convert

用於轉換數據類型,方便后續數據統計

(f)geoip

需要下載全球IP庫:GeoLite2-City.mmdb,它可以解決通過IP對城市級別的定位問題。

(g)output輸出設置

logstash 使用 Elasticsearch 輸出插件,把數據發送到 Elasticsearch 進行存儲和搜索

 

(2)啟動logstash

/home/elk/elk5.2/logstash-5.2.1/bin/logstash -f /home/elk/elk5.2/logstash-5.2.1/config/logstash-nginx.conf

 

三、最終效果圖及流量統計

 

 熱力圖:

 

 

針對具體域名進行流量統計

思路:主要是對nginx日志字段 $body_bytes_sent (kibana顯示為size字段)進行流量統計的

注意:因為nginx字段中 $body_bytes_sent ,單位是 byte 傳輸的字節,但是在畫圖統計后,顯示的不太直觀,所以需要轉換成KB/MB/GB

 

1、格式化size字段類型

選中左邊菜單欄的“Management”,找到對應的索引,修改size字段,Format改成“Bytes”類型,保存即可,這樣數據顯示都是經過單位換算的,如B/KB/MB/GB等

 

 2、繪制線條圖查看流量使用情況

找到左邊菜單欄的“Visualize”,選擇線條圖Line chart

 

切換到Data窗口

(1)metrics

Aggregation選擇“Sum”,代表求和;

Field選擇“size”,代表針對size字段

(2)buckets

Aggregation選擇“Date Histogram”,代表按照日期自動划分

Field選擇“timestamp”,代表時間戳

 

比如統計某個域名在過去一個小時里使用的流量,可以在搜索框輸入域名

 

四、注意及總結

 1、logstash配置文件中的output輸出的索引要以“logstash”作為前綴命名,經緯度寫入到[geoip][location]上,否則Tile map成不了圖,除非自定義索引模板,logstash* 有系統自帶的索引模板,默認類型是geo_point,能被地圖識別

 2、一開始使用nginx日志中的$http_x_forwarded_for作為客戶端的ip,發現它有好幾種值:空值(用“-”表示),1個或多個。

可能是下載的全球IP庫解析不出部分ip地址,因為$http_x_forwarded_fo很多時候是代理ip地址,內網ip等是解析不出具體方位的。

最終換成$remote_addr作為客戶端真實訪問ip,沒有出現ip解析錯誤的問題

 

 


免責聲明!

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



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