本教程是基于一台CentOS7的虚拟机完成搭建,若没有特地说明,命令均使用root执行。
因为ELK环境对机器要求不低,若是以本文做学习用途,建议新开一台虚拟机,准备好对应的基础环境即可。
阅读本文需要基础的Nginx命令与概念知识,需了解基础的Linux命令与Nginx的配置文件编写语法。
本文全程会使用绝对路径,所以请对路径问题放心。
本文仅会对ELK相关的使用做出简单介绍与基础教学,并不涉及ELK的底层原理等“硬核”知识,本文的主要是目标是能实现标题所述,并能使各位读者基于本文做出适合自己的日志监控系统。
!!!生产环境请注意以下内容!!!
生产环境极度不建议将ELK全部搭建在一台服务器上,涉及到端口占用、内存CPU压力等问题。建议方式是Elasticsearch和Kibana在一台服务器,Logstash在Nginx日志产生服务器上。
也可以使用占用资源更少的FileBeats做日志收集再传送到ELK服务器,本文不做介绍。
!!!生产环境请注意以上内容!!!
系统:CentOS7
内存:4g
CPU:4核
存储:30g
网络:必需
本文所有软件包保存路径:/usr/local/src/
lnmp完整安装包:lnmp1.9-full (官方云盘链接,放心下载,选择lnmp1.9-full.tar.gz即可,解压即用无需再下载其他主要程序包)
Elasticsearch压缩包:Elasticsearch8.5.0下载页面(下载页面显示所有系统对应的版本,本文将使用Linux x86_64版本,具体视情况而定)
Kibana压缩包:Kibana8.5.0下载页面(下载页面显示所有系统对应的版本,本文将使用Linux x86_64版本,具体视情况而定)
Logstash压缩包:Logstash8.5.0下载页面(下载页面显示所有系统对应的版本,本文将使用Linux x86_64版本,具体视情况而定)
(不推荐)lnmp一键安装包体积小,在服务器上在线下载约1g内容,在线安装,对服务器的网络要求偏高
wget http://soft.vpser.net/lnmp/lnmp1.9.tar.gz
Elasticsearch8.5压缩包,完整版
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.0-linux-x86_64.tar.gz
Kibana8.5.0压缩包,完整版
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.0-linux-x86_64.tar.gz
Logstash8.5.0压缩包,完整版
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.0-linux-x86_64.tar.gz
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。 PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。
解压完整安装包
tar -xvf lnmp1.9-full.tar
进入文件夹
cd lnmp1.9-full/
输入安装命令,进入lnmp的mysql安装选择界面。
./install.sh lnmp
按需求选择数据库版本,若已存在数据库则选择不安装,本文使用第5项:MySQL 5.6.51
选择完版本后依次是输入数据库root账户密码、是否启用InnoDB引擎,如下图所示。
按需求选择PHP版本,本文PHP安装全部使用默认设定。
选择完版本后选择是否使用内存优化,本文选择默认不启用,如下图所示。
接下来按下随意按钮即可开始跑码安装,在安装过程中会出现“错误,xxx未安装”等错误提示,此时不用处理,所有缺少的东西lnmp安装包会自动全部帮我们安装好。
安装过程较慢,请耐心等待。
跑码完成后,可以向上滑动一下记录查看是否全部ok,如下图。
lnmp所有的目录都在/usr/local/下,如下图。
到此,LNMP环境搭建完毕,若完全按照本文一样配置安装却有和本文不一致的地方,请查阅文末的《可能遇到的问题与解决方法》篇。
首先将nginx命令加入环境变量,这样以后就不用每次都要通过文件夹名进行nginx状态控制(注意,存在多个nginx版本的情况下请勿执行以下操作)。
使用vim打开环境变量所在的文件。
vim /etc/profile
在profile文件的末尾加上以下内容(注意,这是路径为nginx安装路径,如果是使用lnmp安装可以直接使用以下路径)。
PATH=$PATH:/usr/local/nginx/sbin
wq退出后,重新加载profile文件。
source /etc/profile
输入nginx -v查看命令是否生效。
进入nginx配置文件夹,做好nginx.conf的备份。
cd /usr/local/nginx/conf/
cp nginx.conf nginx.conf.bak1
运行前照例跑一下配置文件测试,虽然全新的nginx没这个必要,但是做好准备总没有坏处
nginx -t
启动nginx。
nginx
访问你的服务器地址,端口号默认80,当出现下图界面后则表示lnmp全套环境安装完毕,可以在此网页查看本地环境。
生产环境请注意探针、phpmyadmin、phpinfo这些界面的加密,或者干脆删除这些页面。
ELK是Elasticsearch、Kibana和Logstash这三个服务的首字母简称,其中Elasticsearch负责数据的存储与索引,Kibana负责可视化面板对数据的显示与分析,Logstash负责采集日志数据给Elasticsearch消费。
需注意,ELK需要版本全部统一,不可以不同版本一起使用,否则会有比较严重的兼容性问题。
ELK全部来自同一家公司,界面优美、操作流畅、提供中文、安装简单,而且免费开源。其更新速度也是非常的快,基本维持一个星期一个小版本更新的速度,本文完成时ELK已经更到了8.5.1(明明刚开始写的时候才8.5.0,是我写太慢了啊哈哈)。
ELK在启动时有的不支持root账户,有的不推荐root账户,为了方便起见,我们创建一个专门的启动用户,新建用户组es并创建用户es
#新增用户es
useradd es
#给es设个密码
passwd es
#新增用户组es
#某些Linux系统在新增用户后自动为他创建组,下面两条命令具体情况视情况看是否需要执行。
groupadd es
#将用户es添加进es组
gpasswd -a es es
本文的ELK将会放在一个统一文件夹内,在路径/usr/local/下新建文件夹,并将其授权给es用户
#前往local目录
cd /usr/local/
#创建文件夹elk用来放三个服务的文件
mkdir elk
#将elk目录的拥有者设定为上面创建的es
chown -R es:es elk
前往我们的安装包保存路径,解压后直接移动到上文中创建好的elk文件夹中。然后将Elasticsearch文件夹也给es用户授权
#前往安装包保存路径
cd /usr/local/src/
#解压
tar -xvf elasticsearch-8.5.0-linux-x86_64.tar.gz
#将解压好的文件夹移动到elk文件夹中
mv elasticsearch-8.5.0 /usr/local/elk/
#再次授权(请注意命令和上文不同)
chown -R es:es /usr/local/elk/*
#进入elk目录,将elasticsearch-8.5.0权限提到最高
cd usr/local/elk/
chmod 777 elasticsearch-8.5.0/
ll
#完成应如下图所示
安装完毕,接下来开始配置Elasticsearch的配置文件,此部分需要基础的vim操作知识,包括查找、显示行号等操作。
#使用vim打开Elasticsearch配置文件
vim /usr/local/elk/elasticsearch-8.5.0/config/elasticsearch.yml
在Network部分打开network.host和http.port的注释,并且修改为服务器的本地ip,如下两图。请注意,若9200端口被占用则自行选择其他端口,若是新服务器则不要改动端口号。
保存退出后,前往Elasticsearch的程序住目录,切换用户es并进行第一次启动。
若出现问题请参考文末《可能遇到的问题与解决方案》
cd /usr/local/elk/elasticsearch-8.5.0/bin/
su es
./elasticsearch
第一次启动后应该可以看到终端上充满了密钥,这时elasticsearch的配置文件已经发生了变化,启动了安全认证模块。然而这个安全认证模块非常麻烦,需要证书不说,其他Kibana和Logstash的配置也会进一步变得麻烦,所以我们这里Ctrl+C关掉elasticsearch,前往配置文件继续修改。
vim /usr/local/elk/elasticsearch-8.5.0/config/elasticsearch.yml
保存退出后,Elasticsearch相关安装已经完成,随时可以启动。
切换回root,前往安装包保存目录解压,然后移动到elk文件,同时给es用户授权
#前往安装包保存目录
cd /usr/local/src/
#解压并移动
tar -xvf kibana-8.5.0-linux-x86_64.tar.gz
mv kibana-8.5.0 /usr/local/elk/
#授权
chown -R es:es /usr/local/elk/*
chmod 777 /usr/local/elk/kibana-8.5.0/
完成授权后进入kibana目录,开始编辑kibana的配置文件,修改内容有kibana自身的地址与端口、对应的elasticsearch的地址与端口、调整kibana的面板语言。
vim /usr/local/elk/kibana-8.5.0/config/kibana.yml
解开端口与地址的注释,一般情况下不要改动默认端口5601,仅修改host即可。
修改对应的elasticsearch地址与端口,和上文elasticsearch部分中自己设定的数据保持一致。
修改kibana面板语言。
保存退出后完成kibana的安装,以后随时可以启动。
进入安装包保存目录,解压后移动到elk文件夹,并给es用户授权。
#前往安装包保存目录
cd /usr/local/src/
#解压并移动
tar -xvf logstash-8.5.0-linux-x86_64.tar.gz
mv logstash-8.5.0 /usr/local/elk/
#授权
chown -R es:es /usr/local/elk/*
chmod 777 /usr/local/elk/logstash-8.5.0/
完成授权后编辑logstash的配置文件,需要修改的内容是ECS Compatibility,将其关闭,目的是为了GeoIP地图显示功能做准备.
vim /usr/local/elk/logstash-8.5.0/config/logstash.yml
进入Elasticsearch目录,启动Elasticsearch
#切换用户为es
su es
#前往Elasticsearch的bin目录
cd /usr/local/elk/elasticsearch-8.5.0/bin/
#启动
./elasticsearch
新开一个终端,前往Kibana目录,启动Kibana
#切换用户为es
su es
#前往Kibana的bin目录
cd /usr/local/elk/kibana-8.5.0/bin/
#启动
./kibana
当看到kibana准备就绪就说明启动完成
使用浏览器输入之前设定的kibana的ip和端口,看到中文界面即可
我们在调试ELK的时候Elasticsearch和Kibana都可以不关闭不重启,主要都是在操作logstash的配置文件。
首先查看一下目前的Nginx格式
cat /usr/local/nginx/conf/nginx.conf
可以发现这个lnmp包帮我们安装的nginx并没有设置任何格式,所以我们可以自己手动设置一个。
nginx日志格式有两种设置方式,一种是写成json格式(如下图1),一种是原生形式的日志格式(如下图2)。从我们使用ELK的角度来讲,json格式是对日志收集与解析非常友好的。
不过考虑到如果有读者阅读本文的目的是在已有的nginx上读取旧的日志,那么冒然改动nginx日志格式明显是不现实的,所以本文将会在主要围绕json格式的基础上带着说一点原生形式日志格式的解析方式。
编辑nginx.conf文件
vim /usr/local/nginx/conf/nginx.conf
#在http段中添加json日志格式
这里的具体格式是具体情况而定,只要是json格式即可,其中IP地址是必须的
28 log_format main_json '{"time": "$time_local", '
29 '"remote_addr": "$remote_addr", '
30 '"referer": "$http_referer", '
31 '"request": "$request", '
32 '"status": $status, '
33 '"bytes": $body_bytes_sent, '
34 '"agent": "$http_user_agent", '
35 '"x_forwarded": "$http_x_forwarded_for", '
36 '"up_addr": "$upstream_addr",'
37 '"up_host": "$upstream_http_host",'
38 '"up_resp_time": "$upstream_response_time",'
39 '"request_time": "$request_time"'
40 ' }';
41
42 access_log /home/wwwlogs/accessjson.log main_json;
或者使用原生nginx日志格式如下图,这里仅举个例子做参考,本文并不使用。
可以看出来和json格式相比,原生日志是没有“key”值的,所以如果使用原生日志格式我们需要额外的使用正则表达式将日志格式解析出来,具体情况可以搜索
grok解析非json格式日志文件。
编辑完成后测试一下配置文件,若success则重新启动nginx
nginx -t
nginx -s reload
若日志未生效,请查看文末《可能遇到的问题与解决方法》
若生产环境无法获得日志格式,请联系您的管理员
本文是在一台虚拟机上进行日志收集,访问ip都是192.168段,所以无法被geoip识别到,因此本文直接使用生产环境中的一个即将过期的waf防火墙日志来进行下一步演示,日志格式为json,所有关键字段和日志内容均作打码处理。
Logstash的配置文件是需要自己写的,但是不用担心,我们使用了json格式后配置文件的编写将会非常容易。
前往logstash主目录,并新建一个conf文件,本文采用test.conf作为文件名。
请注意!在output中的index索引名前面必须要加上“logstash-”,否则无法解析道IP所在的地理位置。
cd /usr/local/elk/logstash-8.5.0/
vim test.conf
input{
file{
path => "日志存储路径/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => json
}
}
filter {
geoip {
source => "在json中IP对应的字段名"
}
}
output{
elasticsearch{
hosts => "192.168.3.16:9200"
index => "logstash-想一个索引名"
}
stdout {}
}
下图中output中的es-hsot和上文不符,已上文的192.168.3.16为准。
这里给一个例子:
input{
file{
path => "/usr/local/nginx/logs/hack/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => json
}
}
filter {
geoip {
source => "realIP"
}
}
output{
elasticsearch{
hosts => "192.168.3.16:9200"
index => "logstash-test"
}
stdout {}
}
进入logstash主目录,使用root用户启动logstash
./bin/logstash -f test.conf
当看到终端上出现日志中的数据时,则表明logstash启动成功。
到了这一步,ELK的搭建与日志解析已经全部完成,下面开始做数据分析和可视化展示
再次访问我们的kibana页面
索引模式和右边列表中匹配,名称请打全。
地图首次加载会较慢,耐心等待地图出现即可
到这里,集群地图显示IP地理位置已经完成。
查看一下nginx.conf中http段的accesslog开关是否打开,默认是关闭的。
1、logstash的配置文件中的ECS Compatibility未设置成disabled,详情请看3.4部分
2、在logstash配置文件的output中的index索引名前面必须要加上“logstash-”,否则无法解析道IP所在的地理位置。详情请看4.2部分。
GeoIP需要真实的外网地址,虚拟机内测试产生的192.168等局域网IP是无法解析的。