Linux搭建ELK-7.5.1分布式集群及配置X-Pack

小柒博客
小柒博客
小柒博客
379
文章
108
评论
2020-11-2114:59:36 评论 1.9K 18953字阅读63分10秒

ELK介绍

需求背景

业务发展越来越庞大,服务器越来越多

各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志

开发人员排查问题,需要到服务器上查日志,不方便

运营人员需要一些数据,需要我们运维到服务器上分析日志

为什么要用到ELK?

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

一个完整的集中式日志系统,需要包含以下几个主要特点:

1)收集-能够采集多种来源的日志数据;

2)传输-能够稳定的把日志数据传输到中央系统;

3)存储-如何存储日志数据;

4)分析-可以支持 UI 分析;

5)警告-能够提供错误报告,监控机制;

而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。

ELK简介

ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。

Elastic Stack包含:

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

详细可参考Elasticsearch权威指南

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

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

Beats在这里是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比 Logstash,Beats所占系统的CPU和内存几乎可以忽略不计

ELK Stack (5.0版本之后)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六种工具:

Packetbeat: 网络数据(收集网络流量数据)

Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)

Filebeat: 日志文件(收集文件数据)

Winlogbeat: windows事件日志(收集 Windows 事件日志数据)

Auditbeat:审计数据 (收集审计日志)

Heartbeat:运行时间监控 (收集系统运行时的数据)

ELK官网:https://www.elastic.co/cn/

中文指南:https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details

ELK架构图:

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

环境准备(集群节点分配)

主机名称

IP地址

操作系统

服务器配置

角色

master

172.168.1.157

CentOS 7.8

8vCPU 16GB

ES节点1

node1

172.168.1.158

CentOS 7.8

8vCPU 16GB

ES节点2

node2

172.168.1.159

CentOS 7.8

8vCPU 16GB

ES节点3

Logstash

172.168.1.248

CentOS 7.8

8vCPU 16GB

Logstash解析日志

Filebeat

172.168.1.248

CentOS 7.8

8vCPU 16GB

Filebeat收集日志

Kibana

172.168.1.248

CentOS 7.8

8vCPU 16GB

Kibana节点

Redis

172.168.1.248

CentOS 7.8

8vCPU 16GB

Redis缓存数据库

Nginx

172.168.1.248

CentOS 7.8

8vCPU 16GB

Web服务器

软件版本

Elasticsearch:elasticsearch-7.5.1-linux-x86_64.tar.gz

Kibana:kibana-7.5.1-linux-x86_64.tar.gz

Logstash:logstash-7.5.1.tar.gz

Filebeat:filebeat-7.5.1-linux-x86_64.tar.gz

JDK:jdk-11.0.1_linux-x64_bin.tar.gz

Redis:redis-5.0.7.tar.gz

Nginx:nginx-1.18.0.tar.gz

一、基础环境配置

注:所有ES节点都需要执行

1、关闭防火墙和selinux

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# setenforce 0

[root@localhost ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

2、内核优化

[root@localhost ~]# vim /etc/security/limits.conf

# 在文件最后添加以下内容

* soft nofile 65537
* hard nofile 65537
* soft nproc 65537
* hard nproc 65537

[root@localhost ~]# vim /etc/security/limits.d/20-nproc.conf

# 配置以下内容

* soft nproc 4096

[root@localhost ~]# vim /etc/sysctl.conf

# 配置以下内容

net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fin_timeout = 120
net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 30000
fs.file-max=655350
vm.max_map_count = 262144
net.core.somaxconn= 65535
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6=1

# 执行sysctl -p命令使其生效

[root@localhost ~]# sysctl –p

3、安装JDK环境

[root@localhost ~]# wget https://mirrors.yangxingzhen.com/jdk/jdk-11.0.1_linux-x64_bin.tar.gz

[root@localhost ~]# tar zxf jdk-11.0.1_linux-x64_bin.tar.gz -C /usr/local

# 配置环境变量,添加以下内容

[root@localhost ~]# vim /etc/profile

export JAVA_HOME=/usr/local/jdk-11.0.1
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

[root@localhost ~]# source /etc/profile

# 看到如下信息,java环境配置成功

[root@localhost ~]# java -version

java version "11.0.1" 2018-10-16 LTS

Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)

Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

4、创建ELK用户

[root@localhost ~]# useradd elk

5、配置hosts文件

[root@master ~]# vim /etc/hosts

172.168.1.157	master
172.168.1.158	node1
172.168.1.159	node2

6)配置主机名

# Master主机

[root@localhost ~]# hostnamectl set-hostname master

# Node1主机

[root@localhost ~]# hostnamectl set-hostname node1

# Node2主机

[root@localhost ~]# hostnamectl set-hostname node2

二、安装Elasticsearch分布式集群

# Master节点上操作

1、下载Elasticsearch软件包

[root@master ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz

2、解压并重命名

[root@master ~]# tar xf elasticsearch-7.5.1-linux-x86_64.tar.gz

[root@master ~]# mv elasticsearch-7.5.1 /usr/local/elasticsearch

3、创建持久化目录及logs日志目录

[root@master ~]# mkdir -p /data/elasticsearch/{data,logs}

4、修改elasticsearch.yml配置文件,文件内容如下

[root@master ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml

# 集群名称
cluster.name: es-cluster
# 节点名称
node.name: master
# 存放数据目录,先创建该目录
path.data: /data/elasticsearch/data
# 存放日志目录,先创建该目录
path.logs: /data/elasticsearch/logs
# 节点IP
network.host: master
# tcp端口
transport.tcp.port: 9300
# http端口
http.port: 9200
# 服务发现节点列表,若有多个节点,则节点进行对应的配置
discovery.seed_hosts: ["master:9300","node1:9300","node2:9300"]
# 初始主节点
cluster.initial_master_nodes: ["master","node1","node2"]
# 候选节点数
gateway.recover_after_nodes: 2
# 心跳超时时间
discovery.zen.ping_timeout: 60s
# 节点检测时间
discovery.zen.fd.ping_interval: 120s
# ping 超时时间
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 3
# 是否允许作为主节点
node.master: true
# 是否保存数据
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

# 配置JVM参数,最大不要超过32G,并且留一半内存给操作系统,默认是1g,这里分配4G

[root@master ~]# sed -i -e 's/-Xms1g/-Xms4g/' -e 's/-Xmx1g/-Xmx4g/' /usr/local/elasticsearch/config/jvm.options

5、拷贝Elasticsearch安装目录、Elasticsearch数据目录到node1和node2主机

[root@master ~]# scp -r /usr/local/elasticsearch/ root@node1:/usr/local/

[root@master ~]# scp -r /usr/local/elasticsearch/ root@node2:/usr/local/

[root@master ~]# scp -r /data/elasticsearch/ root@node1:/data/

[root@master ~]# scp -r /data/elasticsearch/ root@node2:/data/

注意:Node1节点跟Node2节点只需修改节点名称和本地IP地址即可

# 节点Node1的修改

# 节点名称

node.name: node1

# 节点IP

network.host: 172.168.1.158

# 节点Node2的修改

# 节点名称

node.name: node2

# 节点IP

network.host: 172.168.1.159

6、ELK用户授权

# Master节点

[root@master ~]# chown -R elk.elk /usr/local/elasticsearch/

[root@master ~]# chown -R elk.elk /data/elasticsearch/*

# Node1节点

[root@node1 ~]# chown -R elk.elk /usr/local/elasticsearch/

[root@node1 ~]# chown -R elk.elk /data/elasticsearch/*

# Node2节点

[root@node2 ~]# chown -R elk.elk /usr/local/elasticsearch/

[root@node2 ~]# chown -R elk.elk /data/elasticsearch/*

7、启动Elasticsearch服务(第一次先测试好然后再加-d后台启动)

[root@master ~]# su - elk

[elk@master ~]$ /usr/local/elasticsearch/bin/elasticsearch

8、后台启动Elasticsearch服务

[elk@master ~]$ /usr/local/elasticsearch/bin/elasticsearch -d

9、查询ES的集群状态

# 第一种

[elk@master ~]$ curl -XGET 'http://172.168.1.157:9200/_cat/nodes'

172.168.1.158 29 26 0 0.05 0.03 0.05 dm - node1

172.168.1.159 19 32 0 0.00 0.01 0.05 dm - node2

172.168.1.157 28 40 0 0.00 0.01 0.05 dm * master

[elk@master ~]$ curl -XGET 'http://172.168.1.158:9200/_cat/nodes'

172.168.1.158 29 26 0 0.05 0.03 0.05 dm - node1

172.168.1.157 28 40 0 0.00 0.01 0.05 dm * master

172.168.1.159 19 32 0 0.00 0.01 0.05 dm - node2

[elk@master ~]$ curl 'http://172.168.1.159:9200/_cat/nodes'

172.168.1.158 30 26 0 0.04 0.03 0.05 dm - node1

172.168.1.159 19 32 0 0.00 0.01 0.05 dm - node2

172.168.1.157 29 40 0 0.00 0.01 0.05 dm * master

# 带*号的是通过选举出来的master

# 第二种

[elk@master ~]$ curl -X GET 'http://172.168.1.157:9200/_cluster/health?pretty'

{

"cluster_name" : "es-cluster",

"status" : "green",

"timed_out" : false,

"number_of_nodes" : 3,

"number_of_data_nodes" : 3,

"active_primary_shards" : 1,

"active_shards" : 2,

"relocating_shards" : 0,

"initializing_shards" : 0,

"unassigned_shards" : 0,

"delayed_unassigned_shards" : 0,

"number_of_pending_tasks" : 0,

"number_of_in_flight_fetch" : 0,

"task_max_waiting_in_queue_millis" : 0,

"active_shards_percent_as_number" : 100.0

}

10、配置SSL并启用X-Pack

10.1、X-pack是什么?

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。

自6.8以及7.1+版本之后,基础级安全永久免费。

基础版本安全功能列表如下:

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

X-Pack安全配置的核心四步骤:

1)设置:xpack.security.enabled: true。

2)生成TLS证书。

3)配置加密通信。

4)设置密码。

10.2、生成节点证书

1、证书实现加密通信的原理

TLS需要X.509证书(X.509 证书是一个数字证书,它使用 X.509 公有密钥基础设施标准将公有密钥与证书中包含的身份相关联。X.509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书)才能对与之通信的应用程序执行加密和身份验证。 为了使节点之间的通信真正安全,必须对证书进行验证。
在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。

2、借助elasticsearch-certutil命令生成证书

[elk@master ~]$ cd /usr/local/elasticsearch/bin

[elk@master bin]$ ./elasticsearch-certutil ca -out /usr/local/elasticsearch/config/elastic-certificates.p12 -pass "www.yangxingzhen.com"

3、将证书拷贝到其他节点,放入/usr/local/elasticsearch/config/目录下

[elk@master bin]$ scp ../config/elastic-certificates.p12 root@node1:/usr/local/elasticsearch/config/

[elk@master bin]$ scp ../config/elastic-certificates.p12 root@node2:/usr/local/elasticsearch/config/

# 因为用root用户拷贝,需要授权(不然启动报错)

[root@node1 ~]# chown -R elk.elk /usr/local/elasticsearch/

[root@node2 ~]# chown -R elk.elk /usr/local/elasticsearch/

4、配置加密通信

启用安全功能后,必须使用TLS来确保节点之间的通信已加密。

在elasticsearch.yml中心新增配置如下:(其他节点相同配置)

[elk@master bin]$ vim ../config/elasticsearch.yml

# 配置X-Pack
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

5、创建证书时输入了密码,那可以通过下面的方法设置。(所有节点需要执行)

# 输入生成证书的密码即可

[elk@master bin]$ ./elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

[elk@master bin]$ ./elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

6、重启Elasticsearch

# 配置为使用TLS的节点无法与使用未加密网络的节点通信(反之亦然)。启用TLS后,必须重新启动所有节点才能保持群集之间的通信。

# 通过查询端口获取PID号

[elk@master bin]$ netstat -lntup |grep 9200

# 杀掉PID号

[elk@master bin]$ kill -9 3337

[elk@master bin]$ /usr/local/elasticsearch/bin/elasticsearch -d

10.3、设置集群密码

# 因为你上面已经做了SSL通信,所以只需要在Master节点上设置用户名和密码就可以了,其他的2个节点就会是相同的用户名密码

# 生成密码有如下两种方式:

auto - 随机生成密码。

interactive - 自定义不同用户的密码。

注意:必须配置好xpack之后,才能设置密码。否则会报错。

# 这里采用自定义密码方式

[elk@master bin]$ /usr/local/elasticsearch/bin/elasticsearch-setup-passwords interactive

注:这里为了方便演示,密码统一设置为www.yangxingzhen.com

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

注:配置了密码之后获取集群状态命令如下

[elk@master bin]$ curl --user elastic:www.yangxingzhen.com -X GET 'http://172.168.1.157:9200/_cluster/health?pretty'

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

11、Elasticsearch常用命令

curl -XDELETE 'http://172.168.1.157:9200/logstash-*' 删除索引(后面为索引名称)

curl -XGET '172.168.1.157:9200/_cat/health?v&pretty' 查看集群状态

curl -XGET '172.168.1.157:9200/_cat/indices?v&pretty' 查看索引

三、安装Kibana

1、下载Kibana软件包

[root@localhost ~]$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz

2、解压Kibana软件包并重命名

[root@localhost ~]$ tar xf kibana-7.5.1-linux-x86_64.tar.gz

[root@localhost ~]$ mv kibana-7.5.1-linux-x86_64 /usr/local/kibana

3、配置Kibana配置文件

[root@localhost ~]$ vim /usr/local/kibana/config/kibana.yml

#配置内容如下

# 配置kibana的端口
server.port: 5601
# 配置监听ip
server.host: "172.168.1.248"
# 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
elasticsearch.hosts: ["http://172.168.1.157:9200"]
elasticsearch.username: "elastic"
elasticsearch.password: "www.yangxingzhen.com"
# 配置kibana的日志文件路径,不然默认是messages里记录日志
logging.dest: /usr/local/kibana/logs/kibana.log
# 配置为中文
i18n.locale: "zh-CN"

4、创建日志目录并授权

[root@localhost ~]# mkdir /usr/local/kibana/logs

[root@localhost ~]# chown -R elk.elk /usr/local/kibana/

5、启动Kibana服务

[root@localhost ~]# su - elk

# 前台启动

[elk@localhost ~]$ /usr/local/kibana/bin/kibana

# 后台启动

[elk@localhost ~]$ /usr/local/kibana/bin/kibana &

温馨提示:可以先前台启动查看日志,正常之后在后台启动。

四、安装Redis

1、下载Redis包

[root@localhost ]# wget -c http://download.redis.io/releases/redis-5.0.7.tar.gz

2、解压安装配置Redis

[root@localhost ]# tar zxf redis-5.0.7.tar.gz

[root@localhost ]# mv redis-5.0.7 /usr/local/redis

[root@localhost ]# cd /usr/local/redis/

[root@localhost ]# make

3、创建数据存放目录

[root@localhost redis]# mkdir -p /data/redis

4、配置Redis

# 随机生成密码

[root@localhost redis]# openssl rand -hex 12

c710403c3c97ac97a269d7a6

[root@localhost redis]# ln -sf /usr/local/redis/src/redis-* /usr/bin

[root@localhost redis]# sed -i "s/127.0.0.1/0.0.0.0/g" /usr/local/redis/redis.conf

[root@localhost redis]# sed -i "/daemonize/s/no/yes/" /usr/local/redis/redis.conf

[root@localhost redis]# sed -i "s/dir .*/dir \/data\/redis/" /usr/local/redis/redis.conf

[root@localhost redis]# sed -i "s/logfile .*/logfile \/usr\/local\/redis\/redis.log/" /usr/local/redis/redis.conf

[root@localhost redis]# sed -i '/appendonly/s/no/yes/' /usr/local/redis/redis.conf

[root@localhost redis]# sed -i "s/# requirepass foobared/requirepass c710403c3c97ac97a269d7a6/" /usr/local/redis/redis.conf

[root@localhost redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@localhost redis]# sysctl vm.overcommit_memory=1

5、创建systemctl管理配置文件

[root@localhost redis]# vim /usr/lib/systemd/system/redis.service

# 配置内容如下

[Unit]
Description=Redis Server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
User=root
Group=root

[Install]
WantedBy=multi-user.target

6)启动Redis服务

[root@localhost redis]# systemctl daemon-reload

[root@localhost redis]# systemctl enable redis

[root@localhost redis]# systemctl start redis

7)查询端口及进程

[root@localhost redis]# netstat -lntup |grep 6379

[root@localhost redis]# systemctl status redis

五、安装Nginx

1)安装依赖软件

[root@localhost ~]# yum -y install make zlib zlib-devel gcc-c++ libtool pcre pcre-devel openssl openssl-devel wget

2)下载Nginx源码包

[root@localhost ~]# wget -c http://nginx.org/download/nginx-1.18.0.tar.gz

3)解压Nginx源码包

[root@localhost ~]# tar zxf nginx-1.18.0.tar.gz

4)进入解压目录,预编译Nginx

[root@localhost ~]# cd nginx-1.18.0

[root@localhost nginx-1.18.0]# useradd -s /sbin/nologin www

[root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-stream

5)编译和安装Nginx

[root@localhost nginx-1.18.0]# make && make install

6)检测配置或安装是否成功:

[root@localhost nginx-1.18.0]# /usr/local/nginx/sbin/nginx -t

如果出现下列信息,则表示安装或配置成功。

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

7)配置Nginx.conf

[root@localhost nginx-1.18.0]# vim /usr/local/nginx/conf/nginx.conf

	user www www;
	worker_processes auto;
	pid /usr/local/nginx/logs/nginx.pid;
events {
	use epoll;
	worker_connections 10240;
	multi_accept on;
	}
http	{
	include       mime.types;
	default_type  application/octet-stream;
	log_format json '{"@timestamp":"$time_iso8601",'
			'"host":"$server_addr",'
			'"clientip":"$remote_addr",'
			'"remote_user":"$remote_user",'
			'"request":"$request",'
			'"http_user_agent":"$http_user_agent",'
			'"size":$body_bytes_sent,'
			'"responsetime":$request_time,'
			'"upstreamtime":"$upstream_response_time",'
			'"upstreamhost":"$upstream_addr",'
			'"http_host":"$host",'
			'"requesturi":"$request_uri",'
			'"url":"$uri",'
			'"domain":"$host",'
			'"xff":"$http_x_forwarded_for",'
			'"referer":"$http_referer",'
			'"status":"$status"}';
	access_log logs/access.log json;
	error_log logs/error.log warn;
	sendfile        on;
	tcp_nopush          on;
	keepalive_timeout  120;
	tcp_nodelay         on;
	server_tokens off;
	gzip    on;
	gzip_min_length 1k;
	gzip_buffers    4 64k;
	gzip_http_version 1.1;
	gzip_comp_level 4;
	gzip_types      text/plain application/x-javascript text/css application/xml;
	gzip_vary       on;
	client_max_body_size 10m;
	client_body_buffer_size 128k;
	proxy_connect_timeout 90;
	proxy_send_timeout 90;
	proxy_buffer_size 4k;
	proxy_buffers 4 32k;
	proxy_busy_buffers_size 64k;
	large_client_header_buffers 4 4k;
	client_header_buffer_size 4k;
	open_file_cache_valid 30s;
	open_file_cache_min_uses 1;
server {
	listen	80;
	server_name	localhost;
	location / {
	proxy_pass   http://172.168.1.248: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;
	}
    }
}

8)创建systemctl管理配置文件

[root@localhost nginx-1.18.0]# vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=Nginx Server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

9)启动Nginx服务

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl enable nginx

[root@localhost ~]# systemctl start nginx

六、安装Filebeat

1、下载Filebeat软件包

[root@localhost ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-linux-x86_64.tar.gz

2、解压并重命名

[root@localhost ~]# tar xf filebeat-7.5.1-linux-x86_64.tar.gz

[root@localhost ~]# mv filebeat-7.5.1-linux-x86_64 /usr/local/filebeat

3、编辑filebeat.yml配置文件,配置内容如下

[root@localhost ~]# vim /usr/local/filebeat/filebeat.yml

#========= Filebeat inputs ==========
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  multiline:
      pattern: '^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}'
      negate: true
      match: after
  fields:
    logtype: nginx_access
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/error.log
  multiline:
      pattern: '^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}'
      negate: true
      match: after
  fields:
    logtype: nginx_error
output.redis:
  enabled: true
  hosts: ["172.168.1.248:6379"]
  password: "c710403c3c97ac97a269d7a6"
  key: "all-access-log"    
  db: 0
  timeout: 10

4、创建Filebeat日志目录

[root@localhost ~]# mkdir /usr/local/filebeat/logs

[root@localhost ~]# chown -R elk.elk /usr/local/filebeat

5、启动filebeat服务

[root@localhost ~]# su - elk

[elk@localhost ~]# cd /usr/local/filebeat

# 前台启动

[elk@localhost filebeat]$ ./filebeat -e -c filebeat.yml >>logs/filebeat.log

# 后台启动

[elk@localhost filebeat]$ nohup ./filebeat -e -c filebeat.yml >>logs/filebeat.log >/dev/null 2>&1 &

七、安装Logstash

1、下载软件包

[root@localhost ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.tar.gz

2、解压并重命名

[root@localhost ~]# tar zxf logstash-7.5.1.tar.gz

[root@localhost ~]# mv logstash-7.5.1 /usr/local/logstash

3、创建nginx.conf文件,添加以下内容

[root@localhost ~]# vim /usr/local/logstash/config/nginx.conf

input {
    redis {
        host => "172.168.1.248"
        port => "6379"
        db => "0"
        password => "c710403c3c97ac97a269d7a6"
        data_type => "list"
        key => "all-access-log"
        codec => json
    }
}

filter {
if [fields][logtype] == "nginx_access" {
        json {
            source => "message"
        } 
		
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" }
        }
		
        date {
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
            target => "@timestamp"
        }
    }
if [fields][logtype] == "nginx_error" {
        json {
            source => "message"
        } 
		
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}" }
        }
		
        date {
            match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
            target => "@timestamp"
        }
    }
}

output {
    if [fields][logtype] == "nginx_access" {
        elasticsearch {
            hosts => ["172.168.1.157:9200","172.168.1.158:9200","172.168.1.159:9200"]
            user => "elastic"
            password => "www.yangxingzhen.com"
            action => "index"
            index => "nginx_access.log-%{+YYYY.MM.dd}"
        }
    }
    if [fields][logtype] == "nginx_error" {
        elasticsearch {
            hosts => ["172.168.1.157:9200","172.168.1.158:9200","172.168.1.159:9200"]
            user => "elastic"
            password => "www.yangxingzhen.com"
            action => "index"
            index => "nginx_error.log-%{+YYYY.MM.dd}"
        }
    }	
}

4、启动logstash服务

[root@localhost ~]# chown -R elk.elk /usr/local/logstash

[root@localhost ~]# su - elk

# 前台启动

[elk@localhost ~]$ /usr/local/logstash/bin/logstash -f /usr/local/logstash/conf/elasticsearch.conf

# 后台启动

[elk@localhost ~]$ cd /usr/local/logstash/bin && nohup ./logstash -f /usr/local/logstash/config/elasticsearch.conf >/dev/null 2>&1 &

八、访问Kibana

# 浏览器访问:http://172.168.1.248,出现如下界面

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

# 输入前面设置的用户名和密码,出现如下界面

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

# 选择自己浏览,出现以下界面

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

分别点击管理--》索引管理,这时候就能看到Nginx的索引信息

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

1)创建Nginx访问日志索引

索引模式--->>创建索引模式,输入索引模式名称,点击下一步

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

2)创建Nginx错误日志索引

索引模式--->>创建索引模式,输入索引模式名称,点击下一步

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

点击Discover,就能看到日志数据了,如下图

Linux搭建ELK-7.5.1分布式集群及配置X-Pack

至此,ELK日志分析平台收集Nginx日志搭建完成。

继续阅读
若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如果喜欢本站,请打赏支持本站,谢谢!
  • 微信号
  • 微信扫一扫加我!
  • weinxin
  • 微信公众号
  • 微信扫一扫关注我!
  • weinxin
小柒博客
  • 本文由 发表于 2020-11-2114:59:36
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: