架构:
1、查看是否有自带的java
java -version
如果有则卸载,个人是另外自行安装的。然后安装,具体安装JDK可参考我的另外一篇文章:
https://blog.csdn.net/qq_33877149/article/details/73437749
安装三台ES服务器,ES和JAVA配置要一样,head插件在主节点上安装即可。
角色定义:
192.168.200.8 (主节点ES + Logstash + redis + kibana + nodejs + head插件)
192.168.200.3 (数据节点ES + Logstash)
192.168.200.4 (数据节点ES + Logstash + nginx + filebeat)
ELK版本信息:
Elasticsearch-6.0.0
logstash-6.0.0
kibana-6.0.0
filebeat-6.0.0
JAVA-1.8
Redis-4.0
NodeJS-8.0
[root@localhost ~]# wget:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
[root@localhost ~]# rpm -ivh elasticsearch-6.0.0.rpm
1、安装成功后,对应目录:
1.1、 配置es:
[root@localhost ~]# vim /etc/elasticsearch/elasticsearch.yml
修改内容为:
cluster.name: master-node # 集群中的名称
node.name: master # 该节点名称
node.master: true # 意思是该节点为主节点
node.data: false # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
http.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["192.168.200.8", "192.168.200.3", "192.168.200.4"] # 配置自动发现
另外两台服务的配置:
192.168.200.3:
cluster.name: master-node # 集群中的名称
node.name: data-node1 # 该节点名称
node.master: false # 意思是该节点为主节点
node.data: true # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
http.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["192.168.200.8", "192.168.200.3", "192.168.200.4"] # 配置自动发现
192.168.200.4:
cluster.name: master-node # 集群中的名称
node.name: data-node2 # 该节点名称
node.master: false # 意思是该节点为主节点
node.data: true # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
http.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["192.168.200.8", "192.168.200.3", "192.168.200.4"] # 配置自动发现
完成以上的配置之后,到主节点 192.168.200.8 上,启动es服务:
[root@localhost ~]# systemctl start elasticsearch.service
查看运行状态和端口:
[root@localhost ~]# ps aux |grep elasticsearch
[root@localhost ~]# netstat -lntp |grep java
9300端口是集群通信用的,9200则是数据传输时用的。
主节点启动成功后,依次启动其他节点即可,我这里其他节点都是启动正常的。
错误集:
如果提示找不到JAVA,,则给上一个软链接即可:
[root@localhost ~]# ln -s /usr/java/jdk1.8.0_181 /usr/bin/
2、安装 head 插件:
2.1、安装nodejs:
[root@localhost ~]# wget https://npm.taobao.org/mirrors/node/v8.0.0/node-v8.0.0-linux-x64.tar.xz
[root@localhost ~]# tar -xvf node-v8.0.0-linux-x64.tar.xz
[root@localhost ~]# mv node-v8.0.0-linux /home/nodejs
[root@localhost ~]# cd /home/nodejs/bin && ll
2.1.1、进去目录后会看到 node 和 npm 文件:
2.1.2、查看当前nodejs版本:
[root@localhost bin]# ./node -v
2.1.3、配置全局使用:
[root@localhost bin]# ln -s /home/node/bin/node /usr/local/bin/node
[root@localhost bin]# ln -s /home/node/bin/npm /usr/local/bin/npm
2.2 、安装git:
[root@localhost bin]# yum -y install git
2.3、安装 elasticsearch-head 插件:
[root@localhost bin]#cd /home
[root@localhost home]# git clone https://github.com/mobz/elasticsearch-head.git
[root@localhost elasticsearch-head]# cd elasticsearch-head
[root@localhost elasticsearch-head]# npm install
如果 npm install 报错,无法下载PhantomJS,则手动安装 PhantomJS
2.4、安装PhantomJS:
[root@localhost home]# wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@localhost home]# tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@localhost home]# mv phantomjs-2.1.1 phantomjs
2.4.1、安装依赖软件:
[root@localhost home]# yum -y install fontconfig
2.4.2、配置全局使用:
[root@localhost home]# ln -s /home/phantomjs/bin/phantomjs /usr/bin/
2.4.3、查看版本:
[root@localhost home]# phantomjs --version
[root@localhost home]# source ~/.bashrc
2.4.5、安装完phantomjs 后,再回去安装elasticsearch-head:
[root@localhost elasticsearch-head]# cd elasticsearch-head
[root@localhost elasticsearch-head]# npm install
2.5、配置插件文档:
2.5.1、修改elasticsearch.yml,增加跨域的配置(需要重启es才能生效):
[root@localhost elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
在最后一行加入配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
2.5.2、修改Gruntfile.js文件:
[root@localhost elasticsearch-head]# vim /home/elasticsearch-head/Gruntfile.js
增加hostname属性
2.5.2、修改app.js文件:
[root@localhost elasticsearch-head]# vim /home/elasticsearch-head/_sit/app.js
修改head连接es的地址(修改localhost为本机的IP地址)
2.5.3、启动插件:
[root@localhost elasticsearch-head]# cd /home/elasticsearch-head/node_modules/grunt/bin/
[root@localhost bin]# nohup ./grunt server & exit
2.5.4、使用IE浏览器在web访问:192.168.200.8:9100 即可。
错误集:
1、启动elasticsearch出现的错误集:
使用命令:
systemctl daemon-reload
2、如果安装java后还提示缺少java,则:
vim /etc/sysconfig/elasticsearch
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
1、安装:
[root@localhost home]# tar -zxvf redis-4.0.6.tar.gz
[root@localhost home]# mv redis-4.0.6 /home/redis
[root@localhost redis]# cd /home/redis/src
[root@localhost redis]# make
配置全局使用:
[root@localhost redis]# ln -sv /home/redis usr/local/redis
[root@localhost redis]# cd /usr/local/redis
[root@localhost redis]# cp /home/redis/src/redis-server /usr/bin/
[root@localhost redis]# cp /home/redis/src/redis-cli /usr/bin/
2、配置:
[root@localhost redis]# vim redis.conf
修改为:
bind 192.168.200.8
daemonize yes
save ""
requirepass 123456 #可选,开启认证,本人未开启。
3、运行redis:
[root@localhost redis]# redis-server /usr/local/redis/redis.conf
3.1、检查是否已经运行:
[root@localhost ~]# netstat -tulnp |grep 6379
3.1.1、无认证的登陆检查:
[root@localhost ~]# redis-cli -h 192.168.200.8
3.1.2、有认证的登陆检查:
更多关于redis的使用,自行百度学习哦!
1、在192.168.200.4上安装:
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm
[root@localhost ~]# rpm -ivh filebeat-6.0.0-x86_64.rpm
2、配置:
[root@localhost ~]# vim /etc/filebeat/filebeat.yml
2.1、这里主要是通过filebeat收集nginx的日志,发送 到redis服务器上。修改内容为:
filebeat.prospectors:
- type: log
#enabled: false 这一句要注释掉
paths:
- /var/log/nginx/*.log # 指定需要收集的日志文件的路径
#json格式
json.message_key: log
json.keys_under_root: true
#output.elasticsearch: # 先将这几句注释掉
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
output.redis: #输出到redis上
hosts: ["192.168.200.8:6379"]
key: "nginx_log"
db: 5
timeout: 5
2.2、然后启动filebeat:
[root@localhost ~]# systemctl start filebeat.service
去192.168.200.8服务器上查看redis是否有数据:
[root@localhost ~]# redis-cli -h 192.168.200.8
如果有这个key,则表示收集成功。如果没有请检查防火墙是否关闭,redis服务器是否已经开启?filebeat是否报错?
关于nginx的安装,自行百度哦!
#进入nginx的配置目录
[root@localhost ~]# cd /usr/local/nginx/conf
[root@localhost ~]# vim nginx.conf
1、定义json格式:
#一定要写成一行,禁止有空格和回车符!否则收集到redis的数据格式为零散的!
log_format nginx_log_json
'{"ip":"$proxy_add_x_forwarded_for","http_host":"$host","@timestamp":"$time_iso8601","method":"$request_method","url":"$request_uri","status":"$status","http_referer":"$http_referer","body_bytes_sent":"$body_bytes_sent","request_time":"$request_time","http_user_agent":"$http_user_agent","total_bytes_sent":"$bytes_sent","server_ip":"$server_addr"}';
2、关于nginx格式变量说明:
2.1、定义的字段说明:
3、日志格式定义好后,去设置nginx反向代理的日志存储:
4、重新加载nginx,然后去redis上查看日志内容:
使用json格式化工具查看这段值:
到这里,nginx的日志格式基本就可以了。可以根据自己的需要去定义自己想要的格式。但注意的是,一定要写成一行!
1、在192.168.200.8上安装:
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm
[root@localhost ~]# rpm -ivh logstash-6.0.0.rpm
2、配置:
[root@localhost ~]# vim /etc/logstash/logstash.yml
修改为:
http.host: "192.168.200.8" #注意,这里设置为服务器的ip地址
192.168.200.3 服务器上配置同上。
3、展示redis的数据:
[root@localhost ~]# cd /etc/logstash/conf.d/
[root@localhost conf.d]# vim redis_logstash.conf
格式说明:
3.1、先从哪里读取,由于我们是使用redis暂存,所以就从redis上读取
input {
redis {
data_type => "list" # 指定为list类型
host => "192.168.200.8" # redis服务器ip
db => "5" # filebeat 收集日志的那个库
port => "6379" # redis的端口
key => "nginx_log" # filebeat 收集日志的那个key
add_field => { "[@metadata][myid]" => "nginxaccess-log" } #增加一个字段,用于标识和判断,与下方output输出相对应
}
}
3.2、定义展示在kibana的格式
filter {
geoip { # ip定位,这里暂时不讲
source => "ip"
database => "/home/logstash/GeoLite2City/GeoLite2-City.mmdb" # ip定位,这里暂时不讲
}
if [@metadata][myid] == "nginxaccess-log" {
mutate {
gsub => ["message", "\\x", "\\x"] # message字段,也就是日志的输出内容,插件作用就是讲message字段内容中UTF8单字节编码做替换处理,目的就是应对URL出现中文情况,防止乱码的出现
}
if ( 'method":"HEAD' in [message] ) {
drop {} # 如果message字段中有HEAD请求,就会删除
}
json { #启动json解码插件,因为输入的数据是复合的数据结构,只是一部分记录的是json格式
source => "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字段了,这里直接移除
}
}
}
3.3、输出redis数据:
output {
if [@metadata][myid]=="nginxaccess-log" { # 当有多个输入源的时候,可根据不同的标识,指定不同的输出地址
elasticsearch {
hosts =>["192.168.200.8:9200"]
#index => "redis-nginx-%{+YYYY-MM-dd}"
index => "logstash-nginx-access-%{+YYYY-MM}" # 使用kibana的地图时会用到这个格式。
}
}
}
3.4整个文件:
4、检查文件格式是否有错:
[root@localhost ~]# cd /usr/share/logstash/bin
[root@localhost bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/redis_logstash.conf --config.test_and_exit
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK # 为ok则代表配置文件没有问题
[root@localhost bin]#
5、启动配置文件:
[root@localhost ~]# cd /usr/share/logstash/bin
[root@localhost bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/redis_logstash.conf
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
# 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端
1、安装:
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm
[root@localhost ~]# rpm -ivh kibana-6.0.0-x86_64.rpm
2、配置:
[root@localhost ~]# vim /etc/kibana/kibana.yml
修改为:
server.port: 5601 # 配置kibana的端口
server.host: 192.168.200.8 # 配置监听ip
elasticsearch.url: "http://192.168.200.8:9200" # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
2.1:配置kibana服务器的ip以及配置的监听端口:
[root@localhost ~]# vim /etc/rsyslog.conf
#### RULES ####
*.* @@192.168.200.8:9600
重启rsyslog,让配置生效:
[root@data-node1 ~]# systemctl restart rsyslog
3、启动:
[root@localhost ~]# systemctl start kibana
4、查看运行状态和端口:
[root@localhost ~]# ps aux |grep kibana
[root@localhost ~]# netstat -lntp |grep 5601
5、浏览器访问:
http://192.168.200.8:5601 或者 elk.kinth.com #因为在nginx上配置了这个反向代理
5.1、Create后,点击 Discover 查看日志:
现在显示的就是我们在logstash处理后的格式,随便点进去一条数据查看JSON内容,会更加详细:
ELK搭建暂时就这样。图形化显示的,改天再写吧!
主要参考博客:
http://blog.51cto.com/zero01/2079879
https://www.cnblogs.com/bixiaoyu/p/9576570.html