原創|利用ELK分析Nginx日誌生產實戰(高清多圖)

本文以api.mingongge.com.cn域名爲測試對象進行統計,日誌爲crm.mingongge.com.cn和risk.mingongge.com.cn請求之和(此兩者域名不具生產換環境統計意義),生產環境請根據具體須要統計的域名進行統計。前端

因爲涉及生產線上服務器,故本文部分服務器IP作了打碼處理。linux

1、服務介紹nginx

1.一、ELKgit

ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個服務器上搜集日誌後傳輸給Logstash,官方也推薦此工具。web

Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。docker

Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。shell

Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。json

1.二、Nginxbootstrap

Nginx("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:新浪、網易、騰訊等。windows

本文中前端使用了nginx的反向代理功能,並使用了nginx的HTTP功能。

1.三、Kafka

Kafka是由Apache軟件基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,它能夠處理消費者規模的網站中的全部動做流數據。這種動做(網頁瀏覽,搜索和其餘用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據一般是因爲吞吐量的要求而經過處理日誌和日誌聚合來解決。 對於像Hadoop同樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是經過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了經過集羣來提供實時的消息。

2、架構要求

2.一、架構描述

使用filebeat收集nginx日誌,輸出到kafka;logstash從kafka中消費日誌,經過grok進行數據格式化,輸出到elasticsearch中,kibana從elasticsearch中獲取日誌,進行過濾出圖.

2.二、系統版本

CentOS Linux release 7.2.1511 (Core)
3.10.0-514.26.2.el7.x86_64複製代碼

2.三、軟件版本

jdk1.8.0_144
nginx-1.12.2
filebeat-6.3.2
awurstmeister/kafka(docker image)
logstash-6.5.4
elasticsearch-6.4.0
kibana-6.4.0複製代碼

3、linux系統環境配置與優化

#查看服務器硬件信息
dmidecode|grep "Product Name"

#查看CPU型號
grep name /proc/cpuinfo

#查看CPU個數
grep "physical id" /proc/cpuinfo

#查看內存大小
grep MemTotal /proc/meminfo複製代碼


4、系統初始化

4.一、關閉防火牆

systemctl stop filewalld複製代碼

4.二、關閉selinux

setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config複製代碼

4.三、添加普通帳戶

useradd elsearch
echo "******"|passwd --stdin elsearch複製代碼

4.四、配置yum源

cat /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7複製代碼

4.五、清理開機自啓動服務

for i in `chkconfig --list|grep 3:on |awk '{print $1}'`;do chkconfig$i off;done
for i in crond network rsyslog sshd;do chkconfig --level 3 $ion;done
chkconfig --list|grep 3:on複製代碼

4.六、服務器時間同步

echo '*/5 * * * * /usr/sbin/ntpdate time.windows.com > /dev/null2>&1' >>/var/spool/cron/root複製代碼

4.七、加大文件描述符

echo '* - nofile 65535' >> /etc/security/limits.conf
tail -1 /etc/security/limits.conf
#從新登錄後生效(無需重啓)
ulimit -n(從新登錄後查看)複製代碼

4.八、內核參數調優(可不操做)

\cp /etc/sysctl.conf /etc/sysctl.conf.bak
cat>>/etc/sysctl.conf<<EOF
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout=1
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.ip_local_port_range = 1024 65535
EOF
/sbin/sysctl -p複製代碼

5、部署開始

5.一、更改nginx日志輸出格式

5.1.一、定義日誌格式

cat /etc/nginx/nginx.conf
log_format main '$remote_addr - $remote_user [$time_local]"$request" '
'$status$body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';複製代碼

5.1.二、加載日誌格式到對應域名配置中

cat /etc/nginx/conf.d/vhost/api.mingongge.com.cn.conf
server {
listen 80;
server_name  newtest-msp-api.mingongge.com.cn;
access_log   /var/log/nginx/api.mingongge.com.cn.log main;
}複製代碼

5.1.三、reload生效

nginx -t reload複製代碼

5.1.四、清空原輸出文件,並查看輸出的日誌格式

:> /var/log/nginx/api.mingongge.com.cn.log
tailf /var/log/nginx/api.mingongger.com.cn.log
1xx.2xx.72.175 - - [18/Mar/2019:13:51:17 +0800] "GET/user/fund/113 HTTP/1.1" 200 673 "-" "Mozilla/5.0 (WindowsNT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) sun/1.5.6 Chrome/69.0.3497.106Electron/4.0.3 Safari/537.36" "-"複製代碼

5.二、配置kafka

測試環境使用docker起的kafka,kafka部署掠過,如下任選一種

5.2.一、方法一 建立kafka topic

./kafka-topics.sh --create --topic nginxlog --replication-factor 1--partitions 1 --zookeeper localhost:2181複製代碼

5.2.二、方法二

auto.create.topics.enable=true複製代碼

開啓kafka自動建立topic配置

5.2.三、filebeat部署完成後確認kafka topic中有數據

./kafka-console-consumer.sh --bootstrap-server 192.168.0.53:9091--from-beginning --topic nginxlog複製代碼

輸出以下

{"@timestamp":"2019-03-14T07:16:50.140Z","@metadata":{"beat":"filebeat","type":"doc","version":"6.3.2","topic":"nginxlog"},"fields":{"log_topics":"nginxlog"},"beat":{"version":"6.3.2","name":"test-kafka-web","hostname":"test-kafka-web"},"host":{"name":"test-kafka-web"},"source":"/var/log/nginx/newtest-msp-api.mingongge.com.cn-80.log","offset":114942,"message":"116.226.72.175- - [14/Mar/2019:15:16:49 +0800] newtest-msp-api.mingongge.com.cn POST\"/upstream/page\" \"-\" 200 6314\"http://newtest-msp-crm.mingongge.com.cn/\" 200 192.168.0.49:60070.024 0.024 \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36\"\"-\""}
Processed a total of 7516 messages複製代碼

測試環境中kafka地址爲

192.168.0.53:9091複製代碼

5.三、配置filebeat收集nginx日誌

5.3.一、安裝filebeat

cd /opt/ && wget http://download.mingongge.com.cn/download/software/filebeat-6.3.2-x86_64.rpm
yum localinstall filebeat-6.3.2-x86_64.rpm -y複製代碼

5.3.二、編輯配置文件

cat /etc/filebeat/filebeat.yml

filebeat.prospectors:
- input_type: log
enabled: true
paths:
- /var/log/nginx/api.mingongge.com.cn.log#收集日誌路徑
fields:
log_topics: nginxlog #kafka中topic名稱
json.keys_under_root: true
json.overwrite_keys: true

output.kafka:
enabled: true
hosts:["192.168.0.53:9091"] #kafka地址
topic:'%{[fields][log_topics]}' #kafka中topic名稱
partition.round_robin:
reachable_only: false
compression: gzip
max_message_bytes: 1000000
required_acks: 1複製代碼

5.3.三、啓動filebeat& 開機啓動

systemctl start filebeat
systemctl enable filebeat複製代碼

5.四、配置logstash

5.4.1 編輯配置

cat /usr/local/logstash/config/nginx.conf
input {
kafka {
type =>"nginxlog"
topics =>["nginxlog"]
bootstrap_servers=> ["192.168.0.53:9091"]
group_id =>"nginxlog"
auto_offset_reset=> latest
codec =>"json"
}
}

filter {
if [type] == "nginxlog"{
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
remove_field =>"message"
}
date {
match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
geoip {
source =>"clientip"
target =>"geoip"
database =>"/usr/local/logstash/config/GeoLite2-City.mmdb"
add_field => ["[geoip][coordinates]", "%{[geoip][longitude]}" ] #添加字段coordinates,值爲經度
add_field => ["[geoip][coordinates]", "%{[geoip][latitude]}" ] #添加字段coordinates,值爲緯度
}
mutate {
convert => ["[geoip][coordinates]", "float"]
}
useragent {
source =>"agent"
target =>"userAgent"
}
}
} 
output {
if [type] == 'nginxlog' {
elasticsearch {
hosts =>["http://192.168.0.48:9200"]
index =>"logstash-nginxlog-%{+YYYY.MM.dd}"
}
stdout {codec =>rubydebug}
}
}複製代碼

5.4.二、使用配置文件啓動logstash服務,觀察輸出

/usr/local/logstash/bin/logstash -f nginx.conf

{
"httpversion"=> "1.1",
"verb" =>"GET",
"auth"=> "-",
"@timestamp"=> 2019-03-18T06:41:27.000Z,
"type"=> "nginxlog",
"json"=> {},
"source"=> "/var/log/nginx/newtest-msp-api.mingongge.com.cn-80.log",
"fields" =>{
"log_topics"=> "nginxlog"
},
"response"=> "200",
"offset"=> 957434,
"host"=> {
"name" =>"test-kafka-web"
},
"beat"=> {
"hostname"=> "test-kafka-web",
"version"=> "6.3.2",
"name"=> "test-kafka-web"
},
"bytes"=> "673",
"request"=> "/user/fund/113",
"timestamp"=> "18/Mar/2019:14:41:27 +0800",
"referrer"=> "\"-\"",
"userAgent"=> {
"os"=> "Windows",
"major" => "4",
"patch"=> "3",
"build"=> "",
"minor"=> "0",
"os_name"=> "Windows",
"device"=> "Other",
"name"=> "Electron"
},
"geoip"=> {
"ip" => "1xx.2xx.72.175",
"country_name" => "China",
"coordinates" => [
[0] 121.4012,
[1] 31.0449
],
"region_name" => "Shanghai",
"location" => {
"lat"=> 31.0449,
"lon"=> 121.4012
},
"continent_code" => "AS",
"timezone" => "Asia/Shanghai",
"longitude" => 121.4012,
"city_name" => "Shanghai",
"country_code2" => "CN",
"region_code" => "SH",
"latitude" => 31.0449,
"country_code3" => "CN"
},
"@version"=> "1",
"clientip"=> "1xx.2xx.72.175",
"ident"=> "-",
"agent"=> "\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) sun/1.5.6 Chrome/69.0.3497.106 Electron/4.0.3Safari/537.36\""
}複製代碼

5.4.三、後臺啓動logstash

確認出現以上輸出後,將logstash分離出當前shell,並放在後臺運行

nohup /usr/local/logstash/bin/logstash -f nginx.conf &>/dev/null &複製代碼

5.五、kibana配置

5.5.一、修改kibana配置

/usr/local/kibana-6.5.4-linux-x86_64/config/kibana.yml #增長高德地圖 
tilemap.url:'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'複製代碼

5.5.二、建立Index Pattern

5.5.三、IP訪問TOP5

選擇柱形圖

添加X軸,以geoip.ip爲order by字段

5.5.4 、PV

選擇metric

默認統計總日誌條數,即爲PV數

5.5.五、全球訪問地圖

選擇map

Field選擇geoip.location

選擇添加高德地圖

5.5.六、實時流量

選擇線條圖

5.5.七、操做系統

選擇餅圖

5.5.八、登錄次數

過濾login關鍵字,並作count統計

5.5.九、訪問地區

5.5.十、Dashboard展現

  • IP訪問Top5:每日客戶端IP請求數最多的前五個(可分析出攻擊者IP)

  • PV:每日頁面訪問量

  • 全球訪問圖:直觀的展現用戶來自哪一個國家哪一個地區

  • 實時流量:根據@timestamp字段來展現單位時間的請求數(可根據異常峯值判斷是否遭遇攻擊)

  • 操做系統:展現客戶端所用設備所佔比重

  • 登錄次數:經過過濾request中login的訪問記錄,粗略估算出進行過登錄的次數

  • 訪問地區:展現訪問量最多的國家或地區

  • 需展現其餘指標,可進行自由發揮

- MORE | 往期精彩文章 -


若是你喜歡本文

請長按二維碼關注民工哥技術之路

轉發朋友圈,是對我最大的支持。

相關文章
相關標籤/搜索