ELK+filebeat+redis监控nginx日志

  • 1.环境准备
  • 2.集群搭建
  • 一.nginx服务器
  • 二.redis服务器
  • 三.logstash服务器
  • 四.es服务器
  • 五.kibana服务器
  • 3.测试服务


1.环境准备

背景介绍:

运维人员需要对系统和业务日志进行精准把控,便于分析系统和业务状态.日志分布在不同的服务器上,传统的使用传统的方法依次登录每台服务器查看日志,既繁琐又效率低下.所以我们需要集中化的日志管理工具将位于不同服务器上的日志收集到一起,然后进行分析,展示.

windows 下的redis日志查看_redis


ELK简介:

ELK是三个开源软件的缩写,分别表示:Elasticsearch, Logstash, Kibana, 它们都是开源软件.新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具.

Elasticsearch是个开源分布式搜索引擎,提供搜集,分析,存储数据三大功能.它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等.

Logstash 主要是用来日志的搜集,分析,过滤日志的工具,支持大量的数据获取方式.一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤,修改等操作在一并发往elasticsearch上去.

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总,分析和搜索重要数据日志.

Filebeat是用于转发和集中日志数据的轻量级传送工具.

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

环境准备:

[root@Kibana ~]# cat /etc/hosts #配置主机解析
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.42.200 kibana
192.168.42.201 es
192.168.42.202 logstash
192.168.42.203 redis
192.168.42.204 nginx
[root@Kibana ~]# cat /etc/yum.repos.d/elk.repo #其余yum源均配置清华源
[elk]
name=elk
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-7.x/
gpgcheck=0
enabled=1
[root@Kibana ~]# systemctl stop firewalld #关闭防火墙与selinux
[root@Kibana ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@Kibana ~]# setenforce 0
[root@Kibana ~]# sed -i "s/enforcing/permissive/g" /etc/selinux/config

所需软件:
nginx filebeat logstash elasticsearch kibana openjdk(oraclejdk)

# nginx服务器
[root@nginx ~]# dnf -y install nginx filebeat
# redis服务器
[root@redis ~]# dnf -y install redis
# logstash服务器
[root@Logstash ~]# dnf -y install logstash java-1.8.0-openjdk
# elasticsearch服务器
[root@ES ~]# dnf -y install elasticsearch java-1.8.0-openjdk
# kibana服务器
[root@Kibana ~]# dnf -y install kibana

2.集群搭建

一.nginx服务器

[root@nginx ~]# systemctl start nginx    
[root@nginx ~]# systemctl enable nginx   
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
# 启动完服务记得通过主机网页访问一下,不然没有日志文件
[root@nginx ~]# vim /etc/filebeat/filebeat.yml #更改配置文件
- type: log 

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/nginx/access.log
  # 拓展:日志过滤
  # include_lines: ['test']		表示收集的日志里有test关键字才会收集

# 更改
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
# 为如下配置
output.redis:
  # Array of hosts to connect to.
  hosts: ["192.168.42.203"] # 配置redis服务器ip地址
  password: "123456" 
  key: "filebeattoredis" 
  db: 0
  datatype: list 
  
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
保存退出
[root@nginx ~]# systemctl start filebeat
[root@nginx ~]# systemctl enable filebeat
Synchronizing state of filebeat.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable filebeat
Created symlink /etc/systemd/system/multi-user.target.wants/filebeat.service → /usr/lib/systemd/system/filebeat.service.

二.redis服务器

[root@redis ~]# vim /etc/redis.conf # 修改配置文件
bind 0.0.0.0 # 主要是filebeat可以连接,可以写0.0.0.0
requirepass 123456
保存退出
[root@redis ~]# systemctl restart redis   
[root@redis ~]# systemctl enable redis   
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.
[root@redis ~]# redis-cli -h 192.168.42.203 -a 123456 # 测试redis服务
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.42.203:6379> keys *
1) "filebeattoredis"
192.168.42.203:6379> llen filebeattoredis
(integer) 8 # 使用浏览器访问nginx,这里就会有相关信息,8表示有8条日志在队列中

三.logstash服务器

[root@Logstash ~]# vim /etc/logstash/logstash.yml # 修改配置文件
path.config: /etc/logstash/conf.d/	
[root@Logstash ~]# vim /etc/logstash/conf.d/logstash_nginx.conf
# 添加如下内容
input {
    redis {
        host => "192.168.42.203"
        port => 6379
        password => "123456"
        db => "0"
        data_type => "list"
        key => "filebeattoredis"
    }
}
filter {
  if [app] == "www" {
    if [type] == "nginx" {
      grok {
        match => {
          "message" => "%{IPV4:remote_addr} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:time_local}\] \"%{WORD:request_method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_protocol}\" %{NUMBER:http_status} %{NUMBER:body_bytes_sent} \"%
{GREEDYDATA:http_referer}\" \"%{GREEDYDATA:http_user_agent}\" \"(%{IPV4:http_x_forwarded_for}|-)\""
        }
        overwrite => ["message"]
      }
      date {
          locale => "en"
          match => ["time_local", "dd/MMM/yyyy:HH:mm:ss Z"]
      }
      mutate {
          convert => ["[geoip][coordinates]", "float"]
      }
    }
  }
}

output {
  elasticsearch {
      hosts  => ["http://192.168.42.201:9200"]
      index  => "logstash-nginx-log-format-%{+YYYY.MM.dd}"
  }
  stdout{
  }
}
[root@Logstash ~]# systemctl start logstash
[root@Logstash ~]# systemctl enable logstash        
Created symlink /etc/systemd/system/multi-user.target.wants/logstash.service → /etc/systemd/system/logstash.service.

四.es服务器

[root@ES ~]# vim /etc/security/limits.conf 
# 配置文件最后添加
# 这个配置由四个部分组成:<domain>      <type>  <item>        <value>
* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 65536
es hard fsize unlimited
es soft fsize unlimited
[root@ES ~]# echo "vm.max_map_count=262144 " >> /etc/sysctl.conf # 扩大虚拟内存大小
[root@ES ~]# vim /etc/elasticsearch/elasticsearch.yml
# 修改为如下配置
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1"] # 如果有多台es服务器,这里增加ip地址
cluster.initial_master_nodes: ["node-1"] 
保存退出
[root@ES ~]# systemctl start elasticsearch # 此处启动服务需要等待一会儿
[root@ES ~]# systemctl enable elasticsearch
Synchronizing state of elasticsearch.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.

注意事项:
如果kibana一直显示server is not ready yet

[root@ES ~]# curl http://192.168.42.201:9200/_cat/indices?v
# 看看是否已经存在.kibana的索引
# 有责使用命令删除后重启kibana
[root@ES ~]# curl -X DELETE http://localhost:9200/.kibana*

五.kibana服务器

[root@Kibana ~]# vim /etc/kibana/kibana.yml 
# 修改为如下配置
server.host: "0.0.0.0"	
elasticsearch.hosts: ["http://192.168.42.201:9200"] # es服务器ip地址
logging.dest: /var/log/kibana.log # 日志文件地址
i18n.locale: "zh-CN" # 设置语言为中文
保存退出
[root@Kibana ~]# touch /var/log/kibana.log # 创建日志文件
[root@Kibana ~]# chown kibana.kibana /var/log/kibana.log
[root@Kibana ~]# systemctl start kibana
[root@Kibana ~]# systemctl enable kibana
Synchronizing state of kibana.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable kibana
Created symlink /etc/systemd/system/multi-user.target.wants/kibana.service → /etc/systemd/system/kibana.service.

3.测试服务

注: 浏览器多访问几次nginx服务器,否则没有日志文件

浏览器访问kibana服务器5601端口

windows 下的redis日志查看_redis_02


创建索引:

点击左上角三个横杠->滑到最下面 Stack Management->索引模式->右上角 创建索引模式->索引模式名称 填 “logstash-nginx-log-format*”->下一步->时间字段->@timestamp->创建索引模式

windows 下的redis日志查看_nginx_03


查看索引:

点击左上角三个横杠->Discover

然后就可以自己筛选想要查看的字段了
做可视化图形
点击左上角三个横杠->Dashboard->右上角 创建仪表盘->创建可视化

选择字段做图,例如:我想要查看网页的uv(日访问量),我就添加时间字段和ip字段

至此,集群搭建完成.