介绍
在本教程中,我们将介绍在Ubuntu 16.04上安装Elasticsearch ELK Stack(即Elasticsearch 2.3.x,Logstash 2.3.x和Kibana 4.5.x)。我们还将向您展示如何使用Filebeat 1.2.x将其配置为在集中位置收集和可视化系统的syslog。Logstash是一个用于收集,解析和存储日志以供将来使用的开源工具。Kibana是一个Web界面,可用于搜索和查看Logstash已编入索引的日志。这两个工具都基于Elasticsearch,用于存储日志。
在尝试识别服务器或应用程序的问题时,集中日志记录非常有用,因为它允许您在一个位置搜索所有日志。它也很有用,因为它允许您通过在特定时间范围内关联其日志来识别跨多个服务器的问题。
可以使用Logstash收集所有类型的日志,但我们将本教程的范围限制为syslog收集。
本教程的目标是设置Logstash以收集多个服务器的syslog,并设置Kibana以可视化收集的日志。
我们的ELK堆栈设置有四个主要组件:
我们将在单个服务器上安装前三个组件,我们将其称为ELK服务器。Filebeat将安装在我们要收集日志的所有客户端服务器上,我们将统称为客户端服务器。
一台已经设置好可以使用sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
ELK服务器所需的CPU,RAM和存储量取决于您要收集的日志量。对于本教程,我们将使用具有以下ELK服务器规范的VPS:
除了ELK服务器之外,您还需要一些其他服务器来收集日志。
让我们开始设置我们的ELK服务器!
Elasticsearch和Logstash需要Java,所以我们现在就安装它。我们将安装最新版本的Oracle Java 8,因为这是Elasticsearch推荐的。但是,如果您决定走这条路,它应该可以与OpenJDK一起使用。
将Oracle Java PPA添加到apt
:
sudo add-apt-repository -y ppa:webupd8team/java
更新您的apt
包数据库:
sudo apt-get update
使用此命令安装最新稳定版本的Oracle Java 8(并接受弹出的许可协议):
sudo apt-get -y install oracle-java8-installer
现在已经安装了Java 8,让我们安装ElasticSearch。
通过添加Elastic的包源列表,可以将Elasticsearch与包管理器一起安装。
运行以下命令将Elasticsearch公共GPG密钥导入apt:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
如果您的提示似乎挂起,则可能正在等待您的用户密码(授权该sudo
命令)。如果是这种情况,请输入您的密码。
创建Elasticsearch源列表:
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
apt
再次更新包数据库:
sudo apt-get update
使用以下命令安装Elasticsearch:
sudo apt-get -y install elasticsearch
Elasticsearch现已安装。让我们编辑配置:
sudo nano /etc/elasticsearch/elasticsearch.yml
您需要限制对Elasticsearch实例(端口9200)的外部访问,因此外人无法通过HTTP API读取您的数据或关闭您的Elasticsearch集群。找到指定的行network.host
,取消注释,并将其值替换为“localhost”,使其如下所示:
network.host: localhost
保存并退出elasticsearch.yml
。
现在,启动Elasticsearch:
sudo systemctl restart elasticsearch
然后,运行以下命令以在启动时启动Elasticsearch:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
现在Elasticsearch已启动并运行,让我们安装Kibana。
通过添加Elastic的包源列表,可以将Kibana与包管理器一起安装。
将Kibana添加到您的源列表:
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
更新您的apt
包数据库:
sudo apt-get update
使用此命令安装Kibana:
sudo apt-get -y install kibana
Kibana现已安装。
打开Kibana配置文件进行编辑:
sudo nano /opt/kibana/config/kibana.yml
在Kibana配置文件中,找到指定的行server.host
,并用“localhost”替换IP地址(默认情况下为“0.0.0.0”):
server.host: "localhost"
保存并退出。此设置使得Kibana只能被本地主机访问。这很好,因为我们将使用Nginx反向代理来允许外部访问。
现在启用Kibana服务,然后启动它:
sudo systemctl daemon-reload
sudo systemctl enable kibana
sudo systemctl start kibana
在我们使用Kibana Web界面之前,我们必须设置反向代理。我们现在就用Nginx来做。
因为我们将Kibana配置为侦听localhost
,所以我们必须设置反向代理以允许外部访问它。我们将使用Nginx来实现此目的。
注意
如果您已经有想要使用的Nginx实例,请随意使用它。只需确保配置Kibana,以便Nginx服务器可以访问它(您可能希望将host
值更改为/opt/kibana/config/kibana.yml
Kibana服务器的私有IP地址或主机名)。此外,建议您启用SSL / TLS。
使用apt
安装Nginx的:
sudo apt-get -y install nginx
使用openssl
创建一个管理员用户,被称为“kibanaadmin”(你应该使用其他名称),可以访问Kibana Web界面:
sudo -v
echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
在提示符下输入密码。记住此登录信息,因为您需要它来访问Kibana Web界面。
现在在您喜欢的编辑器中打开Nginx默认服务器块:
sudo nano /etc/nginx/sites-available/default
删除文件的内容,并将以下代码块粘贴到文件中。请务必更新server_name
以匹配您的服务器名称或公共IP地址:
server {
listen 80;
server_name example.com;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
保存并退出。这会将Nginx配置为将服务器的HTTP流量定向到正在侦听localhost:5601
的Kibana应用程序。此外,Nginx将使用我们之前创建的htpasswd.users
文件,并需要基本身份验证。
现在,检查配置是否存在语法错误,如果没有找到则重新启动Nginx:
sudo nginx -t
sudo systemctl restart nginx
如果您按照16.04的初始服务器设置指南进行操作,则表明您已启用UFW防火墙。要允许连接到Nginx,我们可以通过键入以下内容来调整规则:
sudo ufw allow 'Nginx Full'
现在可以通过您的FQDN或ELK服务器的公共IP地址访问Kibana,即http:// elk \ _server \ _public \ _ip /。如果您在Web浏览器中访问,在输入“kibanaadmin”凭据后,您应该会看到一个Kibana欢迎页面,该页面将要求您配置索引模式。在我们安装所有其他组件之后,让我们回过头来看看。
Logstash包可以从与Elasticsearch相同的存储库中获得,我们已经安装了该公钥,所以让我们将Logstash添加到我们的源列表中:
echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
更新您的apt
包数据库:
sudo apt-get update
使用以下命令安装Logstash:
sudo apt-get install logstash
已安装Logstash但尚未配置。
由于我们将使用Filebeat将日志从我们的客户端服务器发送到ELK服务器,因此我们需要创建SSL证书和密钥对。Filebeat使用该证书来验证ELK服务器的身份。使用以下命令创建将存储证书和私钥的目录:
sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private
现在,您有两种生成SSL证书的选项。如果您的DNS设置允许客户端服务器解析ELK服务器的IP地址,请使用选项2。否则,选项1将允许您使用IP地址。
如果您没有DNS设置 - 允许您的服务器,您将收集日志,以解析您的ELK服务器的IP地址 - 您必须将您的ELK服务器的私有IP地址添加到subjectAltName
(SAN)字段我们即将生成的SSL证书。为此,请打开OpenSSL配置文件:
sudo nano /etc/ssl/openssl.cnf
找到文件中的[ v3_ca ]
部分,并在其下添加此行(替换为ELK服务器的专用IP地址):
subjectAltName = IP: ELK_server_private_IP
保存并退出。
现在使用以下命令在适当的位置(/etc/pki/tls/...
)生成SSL证书和私钥:
cd /etc/pki/tls
sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
该logstash-forwarder.crt文件将被复制到所有将日志发送到Logstash服务器,但我们会做到这一点稍晚。让我们完成Logstash配置。如果您使用此选项,请跳过选项2并继续配置Logstash。
如果您使用专用网络进行DNS设置,则应创建包含ELK服务器专用IP地址的A记录 - 该域名将在下一个命令中使用,以生成SSL证书。或者,您可以使用指向服务器的公共IP地址的记录。只需确保您的服务器(您将从中收集日志的服务器)能够将域名解析为您的ELK服务器。
现在生成SSL证书和私钥,在适当的位置(/etc/pki/tls/...
),使用以下内容(在ELK服务器的FQDN中替换):
cd /etc/pki/tls
sudo openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
该logstash-forwarder.crt文件将被复制到所有将日志发送到Logstash服务器,但我们会做到这一点稍晚。让我们完成Logstash配置。
Logstash配置文件采用JSON格式,驻留在/etc/logstash/conf.d
。配置由三部分组成:输入,过滤器和输出。
让我们创建一个名为02-beats-input.conf
的配置文件并设置我们的“filebeat”输入:
sudo nano /etc/logstash/conf.d/02-beats-input.conf
插入以下输入配置:
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
保存并退出。这指定了beats
将在TCP端口上侦听的输入,它将5044
使用我们之前创建的SSL证书和私钥。
如果您按照Ubuntu 16.04初始服务器设置指南进行操作,则将配置UFW防火墙。要允许Logstash在端口上接收连接5044
,我们需要打开该端口:
sudo ufw allow 5044
现在让我们创建一个名为的配置文件10-syslog-filter.conf
,我们将为syslog消息添加一个过滤器:
sudo nano /etc/logstash/conf.d/10-syslog-filter.conf
插入以下syslog 过滤器配置:
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
保存并退出。此过滤器查找标记为“syslog”类型的日志(通过Filebeat),它将尝试grok
用于解析传入的syslog日志以使其具有结构化和可查询性。
最后,我们将创建一个名为30-elasticsearch-output.conf
的配置文件:
sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf
插入以下输出配置:
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
保存并退出。此输出基本上配置Logstash以将节拍数据存储在运行于的Elasticsearch中,该localhost:9200
节点以使用的节拍命名的索引(在我们的示例中为filebeat)。
如果要为使用Filebeat输入的其他应用程序添加过滤器,请确保将文件命名为在输入和输出配置之间进行排序(即在02-和30-之间)。
使用以下命令测试Logstash配置:
sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
几秒钟后,如果没有语法错误,则应显示Configuration OK
。否则,请尝试读取错误输出以查看Logstash配置的错误。
重新启动Logstash并启用它,以使我们的配置更改生效:
sudo systemctl restart logstash
sudo systemctl enable logstash
Logstash将会收听
接下来,我们将加载示例Kibana仪表板。
Elastic提供了几个示例Kibana仪表板和Beats索引模式,可以帮助您开始使用Kibana。虽然我们不会在本教程中使用仪表板,但我们仍会加载它们,因此我们可以使用它包含的Filebeat索引模式。
用curl
将文件下载到您的主目录:
cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.2.2.zip
使用以下命令安装unzip
软件包:
sudo apt-get -y install unzip
接下来,提取存档的内容:
unzip beats-dashboards-*.zip
并使用以下命令将示例仪表板,可视化和Beats索引模式加载到Elasticsearch中:
cd beats-dashboards-*
./load.sh
这些是我们刚刚加载的索引模式:
当我们开始使用Kibana时,我们将选择Filebeat索引模式作为默认值。
因为我们计划使用Filebeat将日志发送到Elasticsearch,所以我们应该加载Filebeat索引模板。索引模板将配置Elasticsearch以智能方式分析传入的Filebeat字段。
首先,将Filebeat索引模板下载到您的主目录:
cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
然后使用以下命令加载模板:
curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
如果模板正确加载,您应该看到如下消息:
{
"acknowledged" : true
}
现在我们的ELK服务器已准备好接收Filebeat数据,让我们转到在每个客户端服务器上设置Filebeat。
对于要将日志发送到ELK服务器上的Logstash的每个Ubuntu或Debian服务器,请执行以下步骤。
在ELK服务器上,将您创建的SSL证书复制到客户端服务器(替换客户端服务器的地址和您自己的登录名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
提供登录凭据后,请确保证书副本成功。它是客户端服务器和ELK服务器之间通信所必需的。
现在,在您的客户端服务器上,将ELK服务器的SSL证书复制到适当的位置(/etc/pki/tls/certs
):
sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
现在我们将安装Topbeat包。
在客户端服务器上,创建Beats源列表:
echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
它还使用与Elasticsearch相同的GPG密钥,可以使用以下命令安装:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后安装Filebeat包:
sudo apt-get update
sudo apt-get install filebeat
Filebeat已安装,但尚未配置。
现在我们将配置Filebeat以连接到ELK服务器上的Logstash。本节将指导您修改Filebeat附带的示例配置文件。完成这些步骤后,您应该有一个类似于此的文件。
在客户端服务器上,创建和编辑Filebeat配置文件:
sudo nano /etc/filebeat/filebeat.yml
注意
Filebeat的配置文件是YAML格式,这意味着缩进非常重要!请务必使用这些说明中指示的相同数量的空格。
在文件顶部附近,您将看到该prospectors
部分,您可以在其中定义探测器,指定应该发送哪些日志文件以及如何处理它们。每个探矿者都由-
角色指示。
我们将修改现有的prospector以发送syslog
和auth.log
Logstash。在paths
中,注释掉- /var/log/*.log
文件。这将阻止Filebeat 将该目录中的每个.log
发送到Logstash。然后为syslog
和添加新条目auth.log
。完成后它应该看起来像这样:
...
paths:
- /var/log/auth.log
- /var/log/syslog
# - /var/log/*.log
...
然后找到指定的行document_type:
,取消注释并将其值更改为“syslog”。修改后应该如下所示:
...
document_type: syslog
...
这指定此prospector中的日志是syslog类型(这是我们的Logstash过滤器正在查找的类型)。
如果要将其他文件发送到ELK服务器,或者对Filebeat如何处理日志进行任何更改,请随时修改或添加prospector条目。
接下来,在该output
部分下,找到显示的行elasticsearch:
,它表示Elasticsearch输出部分(我们不打算使用)。 删除或注释掉整个Elasticsearch输出部分(直到说明的行#logstash:
)。
找到注释掉的Logstash输出部分,由显示的行指示#logstash:
,并通过删除前面的内容取消注释#
。在本节中,取消注释该hosts: ["localhost:5044"]
行。更改localhost
为ELK服务器的专用IP地址(或主机名,如果使用该选项):
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
这会将Filebeat配置为在端口5044
(我们之前为之前指定Logstash输入的端口)连接到ELK服务器上的Logstash。
直接在hosts
条目下,并使用相同的缩进,添加以下行:
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"]
bulk_max_size: 1024
接下来,找到该tls
部分,并取消注释。然后取消注释指定的行certificate_authorities
,并将其值更改为["/etc/pki/tls/certs/logstash-forwarder.crt"]
。它应该看起来像这样:
...
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
这会将Filebeat配置为使用我们在ELK服务器上创建的SSL证书。
保存并退出。
现在重新启动Filebeat以将我们的更改放到位:
sudo systemctl restart filebeat
sudo systemctl enable filebeat
同样,如果您不确定Filebeat配置是否正确,请将其与此示例Filebeat配置进行比较。
现在Filebeat被发送syslog
,并auth.log
以您的ELK服务器上Logstash!对要为其收集日志的所有其他服务器重复此部分。
如果您的ELK堆栈设置正确,Filebeat(在客户端服务器上)应该将您的日志传送到ELK服务器上的Logstash。Logstash应该使用我们之前导入的索引将Filebeat数据加载到Elasticsearch中。
在ELK服务器上,通过使用以下命令查询Filebeat索引,验证Elasticsearch是否确实正在接收数据:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
你应该看到一堆看起来像这样的输出:
...
{
"_index" : "filebeat-2016.01.29",
"_type" : "log",
"_id" : "AVKO98yuaHvsHQLa53HE",
"_score" : 1.0,
"_source":{"message":"Feb 3 14:34:00 rails sshd[963]: Server listening on :: port 22.","@version":"1","@timestamp":"2016-01-29T19:59:09.145Z","beat":{"hostname":"topbeat-u-03","name":"topbeat-u-03"},"count":1,"fields":null,"input_type":"log","offset":70,"source":"/var/log/auth.log","type":"log","host":"topbeat-u-03"}
}
...
如果您的输出显示总命中数为0,则Elasticsearch不会在您搜索的索引下加载任何日志,您应该检查设置是否有错误。如果收到预期输出,请继续执行下一步。
当您在要收集日志的所有服务器上完成Filebeat的设置后,让我们看一下我们之前安装的Web界面Kibana。
在Web浏览器中,转到ELK服务器的FQDN或公共IP地址。输入“kibanaadmin”凭据后,您应该会看到一个页面,提示您配置默认索引模式:
继续并从Index Patterns菜单(左侧)中选择filebeat- *,然后单击Star(设置为默认索引)按钮将Filebeat索引设置为默认值。
现在单击顶部导航栏中的Discover链接。默认情况下,这将显示过去15分钟内的所有日志数据。您应该看到带有日志事件的直方图,其中包含以下日志消息:
现在,因为您只从客户端服务器收集系统日志,因此不会有太多内容。在这里,您可以搜索和浏览日志。您还可以自定义仪表板。
请尝试以下方法:
host: "hostname"
)Kibana还有许多其他功能,例如图形和过滤功能,所以请随意逛逛!
既然您的系统日志是通过Elasticsearch和Logstash集中进行的,并且您可以使用Kibana将它们可视化,那么您应该集中精力处理所有重要日志。请记住,您可以向Logstash发送几乎任何类型的日志或索引数据,但如果使用grok解析和构建数据,则数据会变得更加有用。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Install Elasticsearch, Logstash, and Kibana (ELK Stack) on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有