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

作者: cayman 分类: 服务器技术,编程技术 发布时间: 2018-09-03 08:34
图表

   

最近因为项目需求 需要搭建日志系统   翻阅了好多日志系统 最终决定使用 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 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注