ELK
Posted yizhangheka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK相关的知识,希望对你有一定的参考价值。
ELK
0、ELK概述
角色 | 套接字 |
---|---|
kibana | 192.168.80.20:5601 |
elasticsearch | 192.168.80.20:9200 |
logstash | 192.168.80.10:9600 |
概述
我们在学习ELK之前要明确一下ELK是用来做什么的?为什么要学习ELK?我想这两个基本问题是我们学习任何技能之前必须要回答的问题。
ELK是用来做日志分析的,我们通过日志查看类的工具,也即文本查看类工具(tail -f/less
)也可以做日志分析?为什么要专门用ELK呢?我认为主要的原因有以下两点:|
- ELK自带图形界面,分析结果自动分析、呈现,一目了然。
- 可通过正则表达式自定义需要的日志内容
个人认为ELK也是一种监控,只不过是日志方面的监控,而非全面性质的监控,而像zabbix这种监控工具就属于全面性质的监控,我们可以把ELK看做是zabbix的一种补充。
日志分析其实有多种的解决方案,比如说国内有家厂商叫建恒信安,他们出售一种设备,这种设备的名字叫日志审计,其实就是一个日志分析,我们公司曾经出售过这样的设备,这种设备不过就是一个普通的服务器然后安装了一个日志分析的服务,这家厂商的日志审计是通过JAVA的开发的,在进行操作时也要安装JAVA,我很怀疑,这种设备的系统可能就是根据ELK进行二次开发的,因为ELK也是JAVA开发,而且这种设备的操作界面风格明显也是ELK界面风格,不用说,这种设备肯定是价格不菲;如果我们脚本编程的能力足够强,我们也可以通过脚本将需要的日志信息取出来,就是界面展现这一关不太好弄;免费的日志分析解决方案首选ELK,如果不差钱,买一个现成的日志审计设备也挺好。
ELK一看这样的名字就知道这是三个单词的缩写,这个单词分别对应着三个组件,A组件负责收集日志,如何收集呢?其实就是会一直“盯着”某个日志文件,一有新增内容就会将新增的内容发送给B组件暂时保存起来,此外,还有C组件,C组件的作用就是从B组件将收集到的日志通过图形界面的方式展现出来
ELK是三个组件的集合,分别是:
- Kibana用来展现数据
- Elasticsearch用来存储数据
- Logstash用来收集数据
以上三个组件将可以从 https://www.elastic.co/cn/ 官网下载,由于国内下载速度过慢,下方提供百度云链接,全都是二进制安装,二进制安装相当于windows上的绿色版的软件,一个软件所有的文件都存入在一个目录下面,我们容易进行控制,卸载和升级往往只需要一个
rm
就可以了。
资源下载地址和提取码
链接:https://pan.baidu.com/s/1r4KsX9nKxuRbXWmdacAChg
提取码:cxcx
JDK
JDK的二进制安装
Jdk1.8二进制包下载路径http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
安装
cd /usr/local/src
tar -zxf jdk-8u201-linux-x64.tar.gz -C /usr/local
mv jdk1.8.0_201 /usr/local/
配置Java环境变量/etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
//重读etc/profile
//验证
java -version
注意:我们将ES和kibana安装到一台服务器,然后logstash安装到另一台服务器,两台服务器都要先安装JDK!
1、kibana
install
Kibana安装脚本
cd /usr/local/src/
tar -zxf kibana-6.6.0-linux-x86_64.tar.gz
mv kibana-6.6.0-linux-x86_64 /usr/local/kibana-6.6.0
修改Kibana配置/usr/local/kibana-6.6.0/config/kibana.yml
server.port: 5601
server.host: "192.168.80.20"
elasticsearch.url: "http://192.168.80.20:9200"
#elasticsearch.username: "user"
#elasticsearch.password: "pass"
侦听在0.0.0.0就是所有的接口,用这个配置文件就定义了如果kibana如何连接elasticsearch,通过http://192.168.80.20:9200
Kibana的启动和访问
前台启动Kibana:/usr/local/kibana-6.6.0/bin/kibana
后台启动Kibana:nohup /usr/local/kibana-6.6.0/bin/kibana >/tmp/kibana.log 2>/tmp/kibana.log &
访问Kibana,需要开放5601端口:http://192.168.80.20:5601/
Kibana的安全说明
默认无密码,也是谁都能够访问
如果使用云厂商,可以在安全组控制某个IP的访问
建议借用nginx实现用户名密码登录
authentication
kibana默认任何用户都可以访问,为了保证其安全性,我们需要使用nginx对其安全性加以控制,明确谁可以访问,谁不可以访问。
我们之前学过nginx自带的安全认证,其实就是两种:一种是输入用户名和密码的方式,输入正确的即可以访问;另一种是通过allow或deny进行控制IP。
使用nginx的安全认证时,当用户通过认证之后,nginx将会充当代理,通过代理模块将请求重定向到kibana的侦听的端口上面去.
//修改Kibana配置/usr/local/kibana-6.6.0/config/kibana.yml
server.port: 5601
server.host: "192.168.80.20"
ps auxfww | grep kibana
root 23752 0.4 13.5 1319556 274716 pts/1 Sl+ 10:37 0:50 | \_ /usr/local/kibana-6.6.0/bin/../node/bin/node --no-warnings /usr/local/kibana-6.6.0/bin/../src/cli
kill -9 23752
nohup /usr/local/kibana-6.6.0/bin/kibana >/tmp/kibana.log 2>/tmp/kibana.log &
//编译nginx
yum install -y lrzsz wget gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/src
wget 'http://nginx.org/download/nginx-1.14.2.tar.gz'
tar -zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx && make && make install
//环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/nginx/sbin/
. /etc/profile
第一种方式:Nginx限制源IP访问
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
? '$status $body_bytes_sent "$http_referer" '
? '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
server {
? listen 80;
? location / {
? allow 127.0.0.1;
allow x.x.x.; #允许哪个IP就填写哪个
? deny all;
? proxy_pass http://127.0.0.1:5601;
? }
}
//启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf
nginx -s reload
//观察访问日志, 如果被拒绝了可以在日志里找到源IP
/usr/local/nginx/logs/access.log
第二种方式Nginx配置使用用户名密码的方式
location / {
? auth_basic "elk auth";
? auth_basic_user_file /usr/local/nginx/conf/htpasswd;
? proxy_pass http://127.0.0.1:5601;
? }
设置用户名和密码
openssl passwd -1 cba-123
$1$EEje.I0a$JpeS6j7.8Ckqy3S30Y/Sc0
vim /usr/local/nginx/conf/htpasswd
zhanghe:$1$EEje.I0a$JpeS6j7.8Ckqy3S30Y/Sc0
2、elasticsearch
ELK功能
Kibana用来展现数据
Elasticsearch用来存储数据
Logstash用来收集数据
Elasticsearch介绍
使用Java开发,安装方便
Elasticsearch提供Http接口,方便用户通过http协议管理。
Elasticsearch提供集群模式
Kibana网页在Elasticsearch还没安装前无法访问, 安装完Elasticsearch就好了
Elasticsearch的安装思路:
下载二进制包
解压到对应目录完成安装/usr/local/
目录属主更新为elk,Elasticsearch无法用root启动
ES的安装脚本:
//安装
cd /usr/local/src
tar -zxf elasticsearch-6.6.0.tar.gz
mv elasticsearch-6.6.0 /usr/local/
//配置,定义日志和数据的存放位置,以及套接字
Elasticsearch配置/usr/local/elasticsearch-6.6.0/config/elasticsearch.yml
path.data: /usr/local/elasticsearch-6.6.0/data
path.logs: /usr/local/elasticsearch-6.6.0/logs
network.host: 127.0.0.1
http.port: 9200
//创建普通用户,Elasticsearch的启动,必须得用普通用户启动,否则无法启动
useradd -s /sbin/nologin elk
chown -R elk:elk /usr/local/elasticsearch-6.6.0/
su - elk -s /bin/bash
/usr/local/elasticsearch-6.6.0/bin/elasticsearch -d
解释一下:
path.data: 定义存放数据的文件
path.logs: 定义存放日志的文件
JVM的内存限制更改/usr/local/elasticsearch-6.6.0/config/jvm.options
(可选操作,更改之后内存的占用量会少一些)
-Xms128M
-Xmx128M
验证启动是否成功:
观察日志,日志路径配置文件当中有
观察端口
观察Kibana网页
注意事项
上述我们是将ES侦听在本地环回网卡上,启动没有问题,但是在生产环境当中我们有可能会让其侦听到公网IP上或是全部的网卡上,ES的配置文件会写上0.0.0.0,这种情况下再启动ES就会产生报错,如下所示:
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] #要求最大打开的文件的数量调整为65535
[2]: max number of threads [3829] for user [elk] is too low, increase to at least [4096] #要求最大的线程数4096
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] #要求最大虚拟内存262144
//最大文件打开数调整/etc/security/limits.conf
* - nofile 65536
//最大打开进程数调整/etc/security/limits.d/20-nproc.conf
* - nproc 10240
//内核参数调整/etc/sysctl.conf
vm.max_map_count = 262144
//重载内核参数
sysctl -p
//全部更改完之后要退出终端重新登陆一下才会生效
Elasticsearch监听网卡建议
如果学习,建议监听在127.0.0.1
如果是云服务器的话,一定把9200和9300公网入口在安全组限制一下
自建机房的话,建议监听在内网网卡,监听在公网会被入侵
3、logstash
install
//Logstash的安装脚本
cd /usr/local/src
tar -zxf logstash-6.6.0.tar.gz
mv logstash-6.6.0 /usr/local/
//Logstash的JVM配置文件更新/usr/local/logstash-6.6.0/config/jvm.options,可选配置,减少内存的占用
-Xms200M
-Xmx200M
Logstash支持
Logstash分为输入、输出
输入:标准输入、日志等
输出:标准输出、ES等
Logstash最简单配置/usr/local/logstash-6.6.0/config/logstash.conf
input{
stdin{}
}
output{
stdout{
codec=>rubydebug
}
}
//Logstash的启动和测试
yum install haveged -y; systemctl enable haveged; systemctl start haveged
//前台启动
/usr/local/logstash-6.6.0/bin/logstash -f /usr/local/logstash-6.6.0/config/logstash.conf
//后台启动:nohup /usr/local/logstash-6.6.0/bin/logstash -f /usr/local/logstash-6.6.0/config/logstash.conf >/tmp/logstash.log 2>/tmp/logstash.log &
//测试标准输入和输出
输入:shijiange
输出:{
? "message" => "shijiange",
? "host" => "shijiange51",
"@timestamp" => 2019-02-24T09:24:51.921Z,
"@version" => "1"
}
Logstash读取日志/usr/local/logstash-6.6.0/config/logstash.conf
input {
file {
path => "/var/log/nginx/access.log "
}
}
output{
stdout{
codec=>rubydebug
}
}
### 指向
Logstash配置发送日志到ES数据库/usr/local/logstash-6.6.0/config/logstash.conf
input {
file {
path => "/usr/local/nginx/logs/access.log"
}
}
output {
elasticsearch {
hosts => ["http://192.168.8020:9200"]
}
}
修改了配置之后别忘记修改启动服务,通过kill -1传递一个重载配置的指令也可以。
以上是关于ELK的主要内容,如果未能解决你的问题,请参考以下文章