首頁>技術>

ID:jishuroad

本文以api.mingongge.com.cn域名為測試物件進行統計,日誌為crm.mingongge.com.cn和risk.mingongge.com.cn請求之和(此二者域名不具生產換環境統計意義),生產環境請根據具體需要統計的域名進行統計。

由於涉及生產線上伺服器,故本文部分伺服器IP做了打碼處理。

一、服務介紹

1.1、ELK

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

Elasticsearch是個開源分散式搜尋引擎,提供蒐集、分析、儲存資料三大功能。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。

Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支援大量的資料獲取方式。一般工作方式為c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。

Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。

1.2、Nginx

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網站使用者有:新浪、網易、騰訊等。

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

1.3、Kafka

Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者規模的網站中的所有動作流資料。這種動作(網頁瀏覽,搜尋和其他使用者的行動)是在現代網路上的許多社會功能的一個關鍵因素。這些資料通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。對於像Hadoop一樣的日誌資料和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行載入機制來統一線上和離線的訊息處理,也是為了通過叢集來提供實時的訊息。

二、架構要求

2.1、架構描述

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

2.2、系統版本

CentOS Linux release 7.2.1511 (Core)3.10.0-514.26.2.el7.x86_64

2.3、軟體版本

jdk1.8.0_144nginx-1.12.2filebeat-6.3.2awurstmeister/kafka(docker image)logstash-6.5.4elasticsearch-6.4.0kibana-6.4.0

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

#檢視伺服器硬體資訊dmidecode|grep "Product Name"#檢視CPU型號grep name /proc/cpuinfo#檢視CPU個數grep "physical id" /proc/cpuinfo#檢視記憶體大小grep MemTotal /proc/meminfo

四、系統初始化

4.1、關閉防火牆

systemctl stop filewalld

4.2、關閉selinux

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

4.3、新增普通賬戶

useradd elsearchecho "******"|passwd --stdin elsearch

4.4、配置yum源

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

4.5、清理開機自啟動服務

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

4.6、伺服器時間同步

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

4.7、加大檔案描述符

echo '* - nofile 65535' >> /etc/security/limits.conftail -1 /etc/security/limits.conf#重新登陸後生效(無需重啟)ulimit -n(重新登陸後檢視)

4.8、核心引數調優(可不操作)

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

五、部署開始

5.1、更改nginx日誌輸出格式

5.1.1、定義日誌格式

cat /etc/nginx/nginx.conflog_format main '$remote_addr - $remote_user [$time_local]"$request" ''$status$body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

5.1.2、載入日誌格式到對應域名配置中

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

5.1.3、reload生效

nginx -s reload

5.1.4、清空原輸出檔案,並檢視輸出的日誌格式

:> /var/log/nginx/api.mingongge.com.cn.logtailf /var/log/nginx/api.mingongger.com.cn.log1xx.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.2、配置kafka

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

5.2.1、方法一 建立kafka topic

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

5.2.2、方法二

auto.create.topics.enable=true

開啟kafka自動建立topic配置

5.2.3、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.3、配置filebeat收集nginx日誌

5.3.1、安裝filebeat

cd /opt/ && wget http://download.mingongge.com.cn/download/software/filebeat-6.3.2-x86_64.rpmyum localinstall filebeat-6.3.2-x86_64.rpm -y

5.3.2、編輯配置檔案

cat /etc/filebeat/filebeat.ymlfilebeat.prospectors:- input_type: logenabled: truepaths:- /var/log/nginx/api.mingongge.com.cn.log#收集日誌路徑fields:log_topics: nginxlog #kafka中topic名稱json.keys_under_root: truejson.overwrite_keys: trueoutput.kafka:enabled: truehosts:["192.168.0.53:9091"] #kafka地址topic:'%{[fields][log_topics]}' #kafka中topic名稱partition.round_robin:reachable_only: falsecompression: gzipmax_message_bytes: 1000000required_acks: 1

5.3.3、啟動filebeat& 開機啟動

systemctl start filebeatsystemctl enable filebeat

5.4、配置logstash

5.4.1 編輯配置

cat /usr/local/logstash/config/nginx.confinput {kafka {type =>"nginxlog"topics =>["nginxlog"]bootstrap_servers=> ["192.168.0.53:9091"]group_id =>"nginxlog"auto_offset_reset=> latestcodec =>"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.2、使用配置檔案啟動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.3、後臺啟動logstash

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

nohup /usr/local/logstash/bin/logstash -f nginx.conf &>/dev/null &

5.5、kibana配置

5.5.1、修改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.2、建立Index Pattern

5.5.3、IP訪問TOP5

選擇柱形圖

新增X軸,以geoip.ip為order by欄位

5.5.4 、PV

選擇metric

預設統計總日誌條數,即為PV數

5.5.5、全球訪問地圖

選擇map

Field選擇geoip.location

選擇新增高德地圖

5.5.6、實時流量

選擇線條圖

5.5.7、作業系統

選擇餅圖

5.5.8、登陸次數

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

5.5.9、訪問地區

5.5.10、Dashboard展示

IP訪問Top5:每日客戶端IP請求數最多的前五個(可分析出攻擊者IP)PV:每日頁面訪問量全球訪問圖:直觀的展示使用者來自哪個國家哪個地區實時流量:根據@timestamp欄位來展示單位時間的請求數(可根據異常峰值判斷是否遭遇攻擊)作業系統:展示客戶端所用裝置所佔比重登陸次數:通過過濾request中login的訪問記錄,粗略估算出進行過登陸的次數訪問地區:展示訪問量最多的國家或地區需展示其他指標,可進行自由發揮

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • linux最好用的資源監控工具-glances