一、写在前面

  结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法。而这篇文章介绍的是单独监控nginx 日志分析再进行可视化图形展示,并在用户前端使用nginx 来代理kibana的请求响应,访问权限方面暂时使用HTTP 基本认证加密用户登录。(关于elk权限控制,我所了解的还有一种方式-Shield),等以后有时间了去搞下。下面开始正文吧。。。

  注意:环境默认和上一篇大致一样,默认安装好了E、L、K、3个软件即可。当然了,还有必需的java环境JDK

  开始之前,请允许我插入一张图,来自线上我的测试图:(如果有需要的童鞋,可以私信我,我可以把登录帐号给你。。)

  备注:由于阿里云主机已经删除,无法提供试看了哈。

nginx日志文件其中一行:

218.75.177.193 - - [/Sep/::: +] "POST /newRelease/everyoneLearnAjax HTTP/1.1"   "http://www.xxxxx.com/" 
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" "36.22.6.130"

nginx 服务器日志的log_format格式:

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

二、配置logstash

1.修改配置文件,/etc/logstash/conf.d下。创建一个新的配置文件,内容如下:

[root@log-monitor ~]# cat /etc/logstash/conf.d/nginx_access.conf
input {
file {
path => [ "/data/nginx-logs/access.log" ]
start_position => "beginning"
ignore_older =>
}
} filter {
grok {
match => { "message" => "%{NGINXACCESS}" } }
geoip {
source => "http_x_forwarded_for"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
} mutate {
convert => [ "[geoip][coordinates]", "float" ]
convert => [ "response","integer" ]
convert => [ "bytes","integer" ]
replace => { "type" => "nginx_access" }
remove_field => "message"
} date {
match => [ "timestamp","dd/MMM/yyyy:HH:mm:ss Z"] }
mutate {
remove_field => "timestamp" } }
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-nginx-access-%{+YYYY.MM.dd}"
}
stdout {codec => rubydebug}
}

文件内容大致解释


Logstash 分为 Input、Output、Filter、Codec 等多种plugins。
Input:数据的输入源也支持多种插件,如elk官网的beats、file、graphite、http、kafka、redis、exec等等等、、、
Output:数据的输出目的也支持多种插件,如本文的elasticsearch,当然这可能也是最常用的一种输出。以及exec、stdout终端、graphite、http、zabbix、nagios、redmine等等、、、
Filter:使用过滤器根据日志事件的特征,对数据事件进行处理过滤后,在输出。支持grok、date、geoip、mutate、ruby、json、kv、csv、checksum、dns、drop、xml等等、、
Codec:编码插件,改变事件数据的表示方式,它可以作为对输入或输出运行该过滤。和其它产品结合,如rubydebug、graphite、fluent、nmap等等。
具体以上插件的细节可以去官网,介绍的挺详细的。下面说下该篇中的配置文件的含义:

来源:飞走不可-原文http://www.cnblogs.com/hanyifeng/p/5857875.html

input段:
 file:使用file 作为输入源
  path: 日志的路径,支持/var/log*.log,及[ "/var/log/messages", "/var/log/*.log" ] 格式
  start_position: 从文件的开始读取事件。另外还有end参数
  ignore_older: 忽略早于24小时(默认值86400)的日志,设为0,即关闭该功能,以防止文件中的事件由于是早期的被logstash所忽略。

filter段:
 grok:数据结构化转换工具
  match:匹配条件格式,将nginx日志作为message变量,并应用grok条件NGINXACCESS进行转换
 geoip:该过滤器从geoip中匹配ip字段,显示该ip的地理位置
  source:ip来源字段,这里我们选择的是日志文件中的最后一个字段,如果你的是默认的nginx日志,选择第一个字段即可(注:这里写的字段是/opt/logstash/patterns/nginx 里面定义转换后的)
  target:指定插入的logstash字断目标存储为geoip
  database:geoip数据库的存放路径
  add_field: 增加的字段,坐标经度
  add_field: 增加的字段,坐标纬度
 mutate: 数据的修改、删除、类型转换
  convert: 将坐标转为float类型
  convert: http的响应代码字段转换成 int
  convert: http的传输字节转换成int
  replace: 替换一个字段
  remove_field: 移除message 的内容,因为数据已经过滤了一份,这里不必在用到该字段了。不然会相当于存两份
 date: 时间处理,该插件很实用,主要是用你日志文件中事件的事件来对timestamp进行转换,导入老的数据必备!在这里曾让我困惑了很久哦。别再掉坑了
  match:匹配到timestamp字段后,修改格式为dd/MMM/yyyy:HH:mm:ss Z
 mutate:数据修改
  remove_field: 移除timestamp字段。

output段:
 elasticsearch:输出到es中
  host: es的主机ip+端口或者es 的FQDN+端口
  index: 为日志创建索引logstash-nginx-access-*,这里也就是kibana那里添加索引时的名称


2.创建logstash配置文件之后,我们还要去建立grok使用的表达式,因为logstash 的配置文件里定义的使用转换格式语法,先去logstash的安装目录,默认安装位置:/opt/logstash/下,在该位置创建一个目录patterns:

root@log-monitor ~]# mkdir -pv /opt/logstash/patterns
mkdir: created directory ‘/opt/logstash/patterns’

在该目录下创建格式文件,内容如下:

[root@log-monitor ~]# cat /opt/logstash/patterns/nginx
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} \"%{IPV4:http_x_forwarded_for}\"

  注:该格式的最后有一个http_x_forwarded_for,因为我们日志是启用了cdn代理的。日志的第一段都是cdn的,最后一段才是真正客户的ip。


需要分析的nginx日志路径不在默认的位置,所以我根据logstash 的配置,建个目录先,并将日志文件拷贝进去:

[root@log-monitor ~]# mkdir -pv /data/nginx-logs/
[root@log-monitor ~]# ll /data/nginx-logs/
total
-rw-r--r-- nginx adm Sep : access.log

3.然后就是logstash中配置的GeoIP的数据库解析ip了,这里是用了开源的ip数据源,用来分析客户端的ip归属地。官网在这里:MAXMIND

先把库下载到本地:

[root@log-monitor ~]# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

解压到当前路径,并将它移动到上述我们配置的路径下,当然其它路径也是可以的,不过logstash 的配置文件也需要更改,如下:

[root@log-monitor ~]# gzip -d GeoLiteCity.dat.gz
[root@log-monitor ~]# mv GeoLiteCity.dat /etc/logstash/.

测试下logstash 的配置文件吧,使用它自带的命令去测试,如下:

[root@log-monitor ~]# /opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/nginx_access.conf
Configuration OK

  注:-t -f 参数顺序不能乱,格式就是定死的,-f 后面要跟配置文件;还有就是该测试只能测试语法,标点符号。如果逻辑上有错误的话,还是能启动的。这里就需要在正式启动运行时,多关注日志文件,位置:/var/log/logstash/logstash.log

三、配置Elasticsearch

1.先修改es的配置文件如下(存放路径:/etc/elasticsearch/elasticsearch.yml):

[root@log-monitor ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml
node.name: es-
path.data: /data/elasticsearch/
network.host: 127.0.0.1
http.port:

其它内容都保持默认。主要修改了es的数据存放路径,它默认的路径在根目录下,由于容量太小,而/data容量大。 根据你的实际情况考虑而定。

创建数据存放目录:

[root@log-monitor ~]# mkdir -pv /data/elasticsearch

修改该文件的权限所属者:

[root@log-monitor ~]# chown -R elasticsearch.elasticsearch /data/elasticsearch/

之后重启es,重启logstash。

[root@log-monitor ~]# systemctl restart elasticsearch
[root@log-monitor ~]# systemctl restart logstash

检查启动状态:

[root@log-monitor ~]# netstat -ulntp | grep java
tcp6 127.0.0.1: :::* LISTEN /java
tcp6 127.0.0.1: :::* LISTEN /java
[root@log-monitor ~]# systemctl status logstash
● logstash.service - LSB: Starts Logstash as a daemon.
Loaded: loaded (/etc/rc.d/init.d/logstash)
Active: active (running) since Fri -- :: CST; 38s ago
Docs: man:systemd-sysv-generator()
Process: ExecStart=/etc/rc.d/init.d/logstash start (code=exited, status=/SUCCESS)
CGroup: /system.slice/logstash.service
└─ /bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction= -XX... Sep :: log-monitor systemd[]: Starting LSB: Starts Logstash as a daemon....
Sep :: log-monitor logstash[]: logstash started.
Sep :: log-monitor systemd[]: Started LSB: Starts Logstash as a daemon..

logstash 的日志查看:

[root@log-monitor ~]# tail -f /var/log/logstash/logstash.log
{:timestamp=>"2016-09-09T16:14:26.732000+0800", :message=>"Pipeline main started"}

从上面可以看到启动是正常的,我们在去看下es里的索引,应该已经在倒入数据了。

[root@log-monitor ~]# curl 'localhost:9200/_cat/indices?v'
health status index pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana .1kb .1kb
yellow open logstash-nginx-access-2016.09. .2mb .2mb
yellow open logstash-nginx-access-2016.09. .8kb .8kb

从上面看到数据已经在慢慢的导入了。大概需要一段时间,因为涉及到日志的过滤写入等。不过也很快啦。我们暂时不去配置kibana。先去安装nginx做个代理。

四、安装nginx 配置kibana代理

1.下载稳定版的nginx,这里使用yum安装。或者也可以选择编译,个人觉得rpm包已经足够可以使用。

[root@log-monitor ~]# wget https://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm

2.安装,并修改默认的配置文件

[root@log-monitor ~]# yum localinstall nginx-1.10.-.el7.ngx.x86_64.rpm –y

先将默认的default.conf 移动到其它目录中,或者直接删除也可以。我是直接删除了。然后新建一个elk.conf配置文件,内容如下:

[root@log-monitor ~]# cat /etc/nginx/conf.d/elk.conf
upstream elk {
ip_hash;
server 172.17.0.1: max_fails= fail_timeout=30s;
server 172.17.0.1: max_fails= fail_timeout=30s;
} server {
listen ;
server_name localhost;
server_tokens off; #close slow conn
client_body_timeout 5s;
client_header_timeout 5s; location / {
proxy_pass http://elk/;
index index.html index.htm;
#auth
auth_basic "ELK Private,Don't try GJ!";
auth_basic_user_file /etc/nginx/.htpasswd;
} }

文件内容大致解释:

此处省略500字

3.新建一个http基本认证用户,使用的是httpd的一个工具组件,叫httpd-tools,用于生成加密的用户数据库

[root@log-monitor ~]# yum install httpd-tools –y

新建用户:

[root@log-monitor ~]# htpasswd -cm /etc/nginx/.htpasswd elk
New password:
Re-type new password:
Adding password for user elk

重启nginx,并检查状态

[root@log-monitor ~]# systemctl start nginx
[root@log-monitor ~]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri -- :: CST; 47s ago
Docs: http://nginx.org/en/docs/
Process: ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=/SUCCESS)
Process: ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=/SUCCESS)
Main PID: (nginx)
CGroup: /system.slice/nginx.service
├─ nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─ nginx: worker process Sep :: log-monitor systemd[]: Starting nginx - high performance web server...
Sep :: log-monitor nginx[]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Sep :: log-monitor nginx[]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Sep :: log-monitor systemd[]: Started nginx - high performance web server.
Sep :: log-monitor systemd[]: Started nginx - high performance web server.
Sep :: log-monitor systemd[]: Started nginx - high performance web server.

检查监听端口:

[root@log-monitor ~]# netstat -ultpn | grep :
tcp 0.0.0.0: 0.0.0.0:* LISTEN /nginx: master

修改iptables防火墙,插入以下规则,允许外面访问8888端口。由于我们最终是使用8888端口对外提供服务的,所以kibana的5601,以及es的9200、9300端口都不需要对外

[root@log-monitor ~]# iptables -I INPUT -p tcp -m state --state NEW --dport  -j ACCEPT

4.访问一下网站,验证下:

来源:飞走不可-原文http://www.cnblogs.com/hanyifeng/p/5857875.html

输入我们建立的elk用户,登陆后,可以正常的访问kibana界面即可,如下图:

添加一个索引,这个索引名字就是我们之前在logstash配置文件中导入es中的那个,本文中是logstash-nginx-access-*,如下图:

查看索引,目前自由一个,设置为加星,即是discover默认突出显示的。

然后我们点击Discover,即可看到我们倒入的数据了。如下图:

来源:飞走不可-原文http://www.cnblogs.com/hanyifeng/p/5857875.html

最后这是我的dashboard,主要统计了web站点的客户端ip地址归属地、总的http传输次数、top10 来源ip、top10 请求点击页面、错误请求趋势、等等,如下,上几张图:

五、小结

  ELK优势:

  • 针对网络攻击事件时,方便运维人员查找溯源。
  • 日志集中收集存储,方便后续分析
  • 优化业务、系统时,做到有据可依
                                                   ------> 来自虎神's总结

  搭建的过程中真的蛮辛苦的(毕竟都是英文),出了问题只能google,从不了解到熟悉,也算是种经历啦。不发牢骚了。。

  画图容易,就如虎大牛所说:“先学会了如何查,画图自然而然就简单多了。当然还要知道其中每个字段的含义”。我的下篇文章将会主要说下如何画图(包括上面这些图中样式哈)。有没有点小福利的感觉?

  好啦,睡觉去啦,大家周末玩的happy呀!另外提前祝天下所有美丽可爱善良的教师们,节日快乐。Y(^_^)Y

该文章属于原创,图片均来自真实环境,如您感觉文章还不错,可以转载,但前提一定要注明出处以及来源网址,如下样式:谢谢您的理解

来源:飞走不可-原文http://www.cnblogs.com/hanyifeng/p/5857875.html

参考资料:

https://www.elastic.co/guide/index.html

http://grokdebug.herokuapp.com/patterns

http://www.cnblogs.com/liuning8023/p/5502460.html

https://segmentfault.com/a/1190000000489528

利用 ELK系统分析Nginx日志并对数据进行可视化展示的更多相关文章

  1. ELK系统分析Nginx日志并对数据进行可视化展示

    结合之前写的一篇文章:ELK日志分析平台搭建全过程,上篇文章主要讲了部署方法.而这篇文章介绍的是单独监控nginx 日志分析再进行可视化图形展示. 本文环境与上一篇环境一样,前提 elasticsea ...

  2. 利用ELK分析Nginx日志生产实战(高清多图)

    本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...

  3. 利用ELK分析Nginx日志

    本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...

  4. ELK系统分析nginx日志

    一.nginx nginx 服务器日志的log_format格式: log_format main '$remote_addr - $remote_user [$time_local] "$ ...

  5. ELK对nginx日志进行流量监控

    ELK对nginx日志进行流量监控 一.前言 线上有一套ELK单机版,版本为5.2.1.现在想把nginx访问日志接入到elk里,进行各个域名使用流量带宽的统计分析.要把nginx日志传输到elk上, ...

  6. 使用Docker快速部署ELK分析Nginx日志实践

    原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...

  7. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  8. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  9. 转: 基于elk 实现nginx日志收集与数据分析

    原文链接:https://www.cnblogs.com/wenchengxiaopenyou/p/9034213.html 一.背景 前端web服务器为nginx,采用filebeat + logs ...

随机推荐

  1. python实现自动发送微博,当自己写博客时同步上去。

    一.需求: 自己在github上搭建一个基于Jekyll的博客(http://beginman.cn/),每次写完博客后就要push上去,博客写的再好,基本上没人访问,为了增加访问量,就想利用起来微博 ...

  2. [转]java byte 数据类型(基础)

    package com.suypower.chengyu.test; public class ByteTest { /** * byte 8 bits -128 - + 127 * 1 bit = ...

  3. 【转】drupal7请求异常,执行时间过长的解决方法

    drupal7请求错误,执行时间过长的解决办法 根据你的系统或网络设置Drupal不能读取网页,造成功能缺失.可能是web服务器配置或PHP设置引起的,可用更新.获取更新源.使用OpenID登 录或使 ...

  4. Nagios 安装配置

    ##Debian 6 安装server # apt-get install nagios* 一路设置好各种密码,成功后访问 http://ip/nagios3 既可,默认用户*nagiosadmin* ...

  5. leetCode191/201/202/136 -Number of 1 Bits/Bitwise AND of Numbers Range/Happy Number/Single Number

    一:Number of 1 Bits 题目: Write a function that takes an unsigned integer and returns the number of '1' ...

  6. How to get the Current Controller Name, Action, or ID in ASP.NET MVC

    public static class HtmlRequestHelper { public static string Id(this HtmlHelper htmlHelper) { var ro ...

  7. iOS-Xcode上传后iTunes Connect构建版本不显示

    在升级到Xcode8版本以后大多数人会碰到这个问题-开开心心开发好一款app以后上传到iTunes后台提交审核,然而iTunes Connect后台活动栏里没有出现我们上传的app,确切的说是显示一会 ...

  8. 多个App间传递数据

    平台:Android两个App:A,B:需求:在A中点击一个按钮后,启动B并把数据从A传递到B: 代码: App A: MainActivity.java中添加: Button btn2 = (But ...

  9. 【原】android本地推送

    android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...

  10. TDA - Thread Dump Analyzer (Java线程分析工具)

    TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...