elk/efk 日志系统 部署elasticsearch +kibana +filebeat


最近因为项目需求 需要搭建日志系统 翻阅了好多日志系统 最终决定使用 elk 后来根据项目需求并没有使用Logstash的需求 最终采用efk elasticsearch +kibana +filebeat
环境准备:因为efk 需要的性能比较大 公司阿里云服务器 又经常会面临大流量的情况 所以讲生产环境与日志系统 分在两台服务器上 日志系统在公司里面的服务器 生产环境在阿里云。
服务器配置: 生产环境服务器 centos7 2核4G 日志系统服务器 centos7 8核8g
一、安装 elasticsearch kibana
这里我们使用 elastic提供的rpm安装
1、首先服务器是都安装java
[root@elk]# yum install java-1.8.0-openjdk -y
2、日志系统安装 elasticsearch 首先下载 elasticsearch 与 kibana 安装包 这里面选择最新版 6.4.0
[root@elk]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.rpm
[root@elk]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-x86_64.rpm
3、安装 elasticsearch 与 kibana
[root@elk]# yum localinstall elasticsearch-6.4.0.rpm -y
[root@elk]# yum localinstall kibana-6.4.0-x86_64.rpm -y
4、启动 elasticsearch 与 kibana
[root@elk ]# systemctl daemon-reload
[root@elk ]# systemctl enable elasticsearch
[root@elk ]# cd /usr/share/elasticsearch #默认安装目录
[root@elk ]# bin/elasticsearch-plugin install ingest-geoip
[root@elk ]# bin/elasticsearch-plugin install ingest-user-agent
[root@elk ]# systemctl enable kibana
[root@elk ]# systemctl start elasticsearch #启动
[root@elk ]# systemctl start kibana
4、因为日志系统与生产环境需要在公网中通信 所以 elasticsearch kibana 需要权限验证 蛋疼的是因为 我选用的事最新的 6.4.0 版本 所以导致 elasticsearch head basic之类的权限控制 插件不能用 而 elasticsearch 自身又没有权限 安全控制 最后想到用nginx 进行反代 在nginx 上加上http 验证 所以 elasticsearch kibana 这两个软件默认配置就好 elasticsearch 监听的是 127.0.0.1:9200 kibana 监听的是 127.0.0.1:5001 开始配置nginx
[root@elk ]# yum -y install httpd-tools #安装密码工具
[root@elk ]# htpasswd -c /usr/local/src/nginx/passwd admin #配置密码 admin 为账号
nginx vhost
监听 1389 端口 并新增两行 可以查下 nginx 配置 完整配置我就不放出来
auth_basic "Authorization";
auth_basic_user_file /usr/local/src/nginx/passwd;
并反向代理 5001或 9200
location /
{
proxy_pass http://127.0.0.1:5601;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
这里啰嗦两句 配置nginx 要采用nginx vhost 来配置 建立两个vhost 使用1092 端口反代 9200 端口 1091端口反代 5100 端口 并在1092 端口和1091 端口上启用http验证
5、配置 filebeat 这时候要到正式环境下 配置 同样该主机也要安装java
[root@work ]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
[root@work ]# yum localinstall filebeat-6.4.0-x86_64.rpm -y
这里已配置 nginx 日志系统为例
[root@work ]# filebeat modules enable nginx #启用nginx 模块
[root@work ]# vi /etc/filebeat/modules.d/nginx.yml #添加日志监听路径
编辑添加路径 如图

6、配置输出 编辑 /etc/filebeat/filebeat.yml
output.elasticsearch:
hosts: ["<es_url>"] #日志系统ip加端口
username: "elastic" #nginx http 账号密码
password: "<password>"
setup.kibana:
host: "<kibana_url>"
username: "elastic"
password: "<password>
[root@work ]# filebeat setup # 初始化模板
[root@work ] # service filebeat start #开始发送数据
写在后面 的几个坑
1、如果你自定义了nginx 日志格式 那么恭喜你跟我一样爱折腾 这时候需要你配置filebeat nginx 模块的正则 目录 /usr/share/filebeat/module
nginx 正则配置 并在响应的虚拟主机 access.log 后面加上main
{
"description": "Pipeline for parsing Nginx access logs. Requires the geoip and user_agent plugins.",
"processors": [{
"grok": {
"field": "message",
"patterns":[
"\"?%{IP_LIST:nginx.access.remote_ip_list} - %{DATA:nginx.access.user_name} \\[%{HTTPDATE:nginx.access.time}\\] \"%{GREEDYDATA:nginx.access.info}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\" \"%{DATA:nginx.access.forwarded_for}\" \"%{DATA:nginx.access.upstream_addr}\" \"%{DATA:nginx.access.request_body}\" \"%{DATA:nginx.access.response_time}\""
],
"pattern_definitions": {
"IP_LIST": "%{IP}(\"?,?\\s*%{IP})*"
},
"ignore_missing": true
}
}, {
"grok": {
"field": "nginx.access.info",
"patterns": [
"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}",
""
],
"ignore_missing": true
}
}, {
"remove": {
"field": "nginx.access.info"
}
}, {
"split": {
"field": "nginx.access.remote_ip_list",
"separator": "\"?,?\\s+"
}
}, {
"script": {
"lang": "painless",
"inline": "boolean isPrivate(def ip) { try { StringTokenizer tok = new StringTokenizer(ip, '.'); int firstByte = Integer.parseInt(tok.nextToken()); int secondByte = Integer.parseInt(tok.nextToken()); if (firstByte == 10) { return true; } if (firstByte == 192 && secondByte == 168) { return true; } if (firstByte == 172 && secondByte >= 16 && secondByte <= 31) { return true; } if (firstByte == 127) { return true; } return false; } catch (Exception e) { return false; } } def found = false; for (def item : ctx.nginx.access.remote_ip_list) { if (!isPrivate(item)) { ctx.nginx.access.remote_ip = item; found = true; break; } } if (!found) { ctx.nginx.access.remote_ip = ctx.nginx.access.remote_ip_list[0]; }"
}
}, {
"remove":{
"field": "message"
}
}, {
"rename": {
"field": "@timestamp",
"target_field": "read_timestamp"
}
}, {
"date": {
"field": "nginx.access.time",
"target_field": "@timestamp",
"formats": ["dd/MMM/YYYY:H:m:s Z"]
}
}, {
"remove": {
"field": "nginx.access.time"
}
}, {
"user_agent": {
"field": "nginx.access.agent",
"target_field": "nginx.access.user_agent"
}
}, {
"remove": {
"field": "nginx.access.agent"
}
}, {
"geoip": {
"field": "nginx.access.remote_ip",
"target_field": "nginx.access.geoip"
}
}],
"on_failure" : [{
"set" : {
"field" : "error.message",
"value" : "{{ _ingest.on_failure_message }}"
}
}]
}
2、你登录的kibana 后会发现 nginx access 日志正常 但是 nginx error 的时间会+8小时 这个是因为 nginx error 日志没有记录时区 这个百分直百你会遇到 你要修改/usr/share/filebeat/module/nginx/error/ingest/pipeline.json
{
"date": {
"field": "nginx.error.time",
"target_field": "@timestamp",
"formats": ["YYYY/MM/dd H:m:s"],
"timezone": "Asia/Shanghai" #加上时区
}
}
3、你如果修改了1、2两个个文件 恭喜你 你重新 filebeat setup 初始化会发现并不生效 你要清空 elasticsearch 的data文件夹 然后重启 到日志重新 filebeat setup 记得要先停止 filebeat 再然后 service filebeat start