阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

406次阅读
没有评论

共计 9285 个字符,预计需要花费 24 分钟才能阅读完成。

一、写在前面

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

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

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

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

nginx 日志文件其中一行:

218.75.177.193 - - [03/Sep/2016:03:34:06 +0800] "POST /newRelease/everyoneLearnAjax HTTP/1.1" 200 370 "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 => 0
    }
}

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}
}

View Code

文件内容大致解释:


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 等等。
具体以上插件的细节可以去官网,介绍的挺详细的。下面说下该篇中的配置文件的含义:

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 日志,选择第一个字段即可
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 123476
-rw-r--r-- 1 nginx adm  126430102 Sep  9 16:02 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-1
path.data: /data/elasticsearch/
network.host: 127.0.0.1
http.port: 9200

其它内容都保持默认。主要修改了 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       0      0 127.0.0.1:9200          :::*                    LISTEN      25988/java
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      25988/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 2016-09-09 16:14:17 CST; 38s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 27195 ExecStart=/etc/rc.d/init.d/logstash start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/logstash.service
           └─27201 /bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX...

Sep 09 16:14:17 log-monitor systemd[1]: Starting LSB: Starts Logstash as a daemon....
Sep 09 16:14:17 log-monitor logstash[27195]: logstash started.
Sep 09 16:14:17 log-monitor systemd[1]: 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                            1   1          1            0      3.1kb          3.1kb
yellow open   logstash-nginx-access-2016.09.08   5   1      69893            0     24.2mb         24.2mb
yellow open   logstash-nginx-access-2016.09.09   5   1        339            0    273.8kb        273.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.0-1.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:5601 max_fails=3 fail_timeout=30s;
    server 172.17.0.1:5601 max_fails=3 fail_timeout=30s;
}

server {listen 80;
    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
20160909 12:02:41 CST; 47s ago
    Docs: http:
//nginx.org/en/docs/
  Process: 26422 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
  Process:
26420 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID:
26424 (nginx)
  CGroup:
/system.slice/nginx.service
          ├─
26424 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
          └─
26425 nginx: worker process

Sep09 12:02:41 log-monitor systemd[1]: Starting nginx – high performance web server…
Sep
09 12:02:41 log-monitor nginx[26420]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Sep
09 12:02:41 log-monitor nginx[26420]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Sep
09 12:02:41 log-monitor systemd[1]: Started nginx – high performance web server.
Sep
09 12:03:13 log-monitor systemd[1]: Started nginx – high performance web server.
Sep
09 12:03:26 log-monitor systemd[1]: Started nginx – high performance web server.

检查监听端口:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

五、小结

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

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

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135094.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9285字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7958869
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...