ELK+filebeat部署nginx日志监测
- 数据流程图。
简要说明: filebeat 从监控生成日志,然后将日志输出到 logstash 中,logstash 对数据进行清洗格式化,包括建立索引,存入到 elasticsearch 中。kibana 负责从 es 读取数据进行处理。
部署说明:使用 docker 方式部署。
注意 elk 的版本要匹配,否则各种诡异的问题。项目之间不兼容
1.准备所需镜像:
docker pull elasticsearch:6.5.1
docker pull kibana:6.5.1
docker pull nginx:1.10.2
docker pull docker.elastic.co/logstash/logstash:6.5.1
docker pull docker.elastic.co/beats/filebeat:6.5.1
2.启动相应服务
2.1 启动 nginx 服务
docker run -p 0.0.0.0:8088:80 --name nginx1.10.2 \
-v /srv/nginx_1.10.2/www:/www \
-v /srv/nginx_1.10.2/nginx.conf:/etc/nginx/nginx.conf \
-v /srv/nginx_1.10.2/logs:/data/logs -d nginx:1.10.2
说明:
web 资源文件:/srv/nginx_1.10.2/www
配置文件:/srv/nginx_1.10.2/nginx.conf
日志存储地址:/srv/nginx_1.10.2/logs
nginx 配置文件如下:nginx.conf
核心配置如下:
log_format json '{"@timestamp":"$time_iso8601",
"@version":"1","host":"$server_addr","
client":"$remote_addr", "size":"$body_bytes_sent",
"responsetime":"$request_time","domain":"$host",
"url":"$uri","status":"$status","upstream_addr":"$upstream_addr",
"upstream_response_time":"$upstream_response_time"}';
access_log /data/logs/access.log json;
$upstream_response_time 这个时间 如果使用了负载均衡则是接口的响应时间。这个时间是监测某个接口关键。
nginx 的整体目录结构
[root@localhost nginx_1.10.2]# tree
.
├── logs
│ ├── access.log
│ └── host.access.log
├── nginx.conf
└── www
└── index.html
2.2 启动 elasetiscsearch 服务,
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300
-v /srv/es/data:/usr/share/elasticsearch/data
-v /srv/es/logs:/usr/share/elasticsearch/logs -e "discovery.type=single-node" elasticsearch:6.5.1
将数据盘 和 日志挂在到主机上启动方式,注意对主机的目录进行授权。chmod -R -777 /srv/es/*
启动说明:分别将 es 的数据存储,和日志映射出来。
最重要的是要要知道 es 被分配的 ip,因为这个 ip 是 es 进数据和查询数据的关键。
使用docker inspect
查看:
{
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Containers": {
"62a7412dd07ff44e9f5069a": {
"Name": "elasticsearch",
"EndpointID": "c0d47e47e13a2da91fcf61b7c3",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
}
}
可以看到这个 ip 是 192.19.0.2 。然后再外网通过 192.168.99.234:9200 可以访问了。
2.3 启动 kibana
docker run -d --name kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://172.17.0.2:9200 kibana:6.5.1
这个地方 http://172.17.0.1 网关 和 docker 容器分配的 ip 172.17.0.2 以及实际的 ip 192.168.99.134 的 9200 端口都可以访问!
但是启服务的时候只能使用 172.17.0.2 作为 es 地址,因为容器创建的时候如果没有指定网桥,会被默认的分配到同一个网关下:172.17.0.1。所以只能用 0.2IP
2.4 启动 logstash【日志过滤器】 这个地方坑多, 启动的时候将-d 换成了-it
docker run -it --name logstah -p 5044:5044
-v /srv/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
-v /srv/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml docker.elastic.co/logstash/logstash:6.5.1
说明:5044 是为 filebeat 开放的端口,用于日志输入。
logstash.conf 和 logstash.yml 是两个配置文件,里面指定了 es 的位置。
logstash.conf 的配置文件如下:
input {
beats {
port => 5044
}
}
filter {#这个过滤器很重要,主要是对nginx的日志进行过滤。
#上传上来的信息默认都是在message中。需要对message中的字段进行修正存储。
json{
source => "message" #指定json格式字段,也就是message字段
remove_field => “prospector" #干掉没用的字段
remove_field => "beat"
remove_field => "source"
remove_field => "input"
remove_field => "offset"
remove_field => "fields"
remove_field => "host"
remove_field => "@version"
remove_field => "message" #因为json格式中已经定义好了每个字段,
#所以输出也就是按照每个字段输出,不需要message字段了,这里直接移除
}
mutate {
convert => ["responsetime", "float”]
#将响应时间改为浮点型,因为只有数字形在kibana中进行分析
}
}
#output测试输出到控制台
output {
elasticsearch {
hosts => ["172.17.0.2:9200"] #es地址
index => "cobra-%{type}-%{+YYYY.MM.dd}” #es的索引
document_type => "log"
}
}
logstash.yml 配置如下: 这个配置的地址可得写对,否则项目都起不来。高版本才有得问题,搜都搜不出来的。错误提示证书不对。。
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: http://172.17.0.2:9200
2.5 启动 filebeat
filebeat:
prospectors:
- input_type: log
paths:
- /srv/nginx_1.10.2/logs/access.log
json.keys_under_root: true
json.overwrite_keys: true
output:
logstash:
hosts: ["172.17.0.4:5044"] # logstash地址 这个因为是在一个docker下部署的,
#所以用了内部的地址,实际项目的话应该是映射出去的外网地址。
2.6 访问 nginxweb 页面,形成访问日志。在 kibana 中看到的日志格式如下。注意必须如下,而且待分析的字段是 Number 类型的。
然后在分析界面就可以先指定某个 api 然后分析数据了。 也可以得到每个 api 每天访问量等信息。