ELK+filebeat部署nginx日志监测

  1. 数据流程图。
    流程图

简要说明: 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 每天访问量等信息。

关于我
loading
在线编辑器