如何在CentOS7上安装Elasticsearch1.7、Logstash1.5和Kibana4.1(ELKStack)
注意: 本教程适用于旧版本的 ELK 堆栈,与最新版本不兼容。 本教程的最新版本可在 如何在 CentOS 7 上安装 Elasticsearch、Logstash 和 Kibana(ELK 堆栈)。
介绍
在本教程中,我们将介绍 Elasticsearch ELK Stack 在 CentOS 7 上的安装,即 Elasticsearch 1.7.3、Logstash 1.5.4 和 Kibana 4.1.1。 我们还将向您展示如何配置它以在集中位置收集和可视化系统的 syslog。 Logstash 是一个开源工具,用于收集、解析和存储日志以供将来使用。 Kibana 是一个 Web 界面,可用于搜索和查看 Logstash 已编入索引的日志。 这两个工具都基于 Elasticsearch。
在尝试识别服务器或应用程序的问题时,集中式日志记录非常有用,因为它允许您在一个地方搜索所有日志。 它也很有用,因为它允许您通过在特定时间范围内关联它们的日志来识别跨多个服务器的问题。
可以使用 Logstash 收集所有类型的日志,但我们会将本教程的范围限制为 syslog 收集。
我们的目标
本教程的目标是设置 Logstash 以收集多个服务器的 syslog,并设置 Kibana 以可视化收集的日志。
我们的 Logstash / Kibana 设置有四个主要组件:
- Logstash:Logstash 处理传入日志的服务器组件
- Elasticsearch:存储所有日志
- Kibana:用于搜索和可视化日志的Web界面,将通过Nginx代理
- Logstash Forwarder:安装在将日志发送到 Logstash 的服务器上,Logstash Forwarder 作为日志转发代理,利用 lumberjack 网络协议与 Logstash 通信
我们将在单个服务器上安装前三个组件,我们将其称为 Logstash Server。 Logstash 转发器将安装在我们要为其收集日志的所有客户端服务器上,我们将其统称为 客户端服务器 。
先决条件
要完成本教程,您将需要 CentOS 7 VPS 的 root 访问权限。 可以在此处找到设置说明(步骤 3 和 4): 使用 CentOS 7 进行初始服务器设置。
如果您更喜欢使用 Ubuntu,请查看本教程:如何在 Ubuntu 14.04 上安装 ELK。
Logstash 服务器所需的 CPU、RAM 和存储量取决于您打算收集的日志量。 对于本教程,我们将为 Logstash 服务器使用具有以下规格的 VPS:
- 操作系统:CentOS 7
- 内存:4GB
- 中央处理器:2
除了 Logstash 服务器之外,您还需要一些其他服务器来收集日志。
让我们开始设置我们的 Logstash 服务器吧!
安装 Java 8
Elasticsearch 和 Logstash 需要 Java,所以我们现在就安装它。 我们将安装最新版本的 Oracle Java 8,因为这是 Elasticsearch 推荐的。 但是,如果您决定走那条路,它应该可以与 OpenJDK 一起正常工作。 遵循本节中的步骤意味着您接受 Java SE 的 Oracle 二进制许可协议。
切换到您的主目录并使用以下命令下载 Oracle Java 8(更新 65)JDK RPM:
cd ~ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm"
然后使用 yum 命令安装 RPM(如果您下载了不同的版本,请在此处替换文件名):
sudo yum localinstall jdk-8u65-linux-x64.rpm
现在 Java 应该安装在 /usr/java/jdk1.8.0_65/jre/bin/java
,并从 /usr/bin/java 链接。
您可以删除之前下载的存档文件:
rm ~/jdk-8u65-linux-x64.rpm
现在已经安装了 Java 8,让我们安装 ElasticSearch。
安装 Elasticsearch
通过添加 Elastic 的包存储库,可以使用包管理器安装 Elasticsearch。
运行以下命令将 Elasticsearch 公共 GPG 密钥导入 rpm:
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为 Elasticsearch 创建和编辑一个新的 yum 存储库文件:
sudo vi /etc/yum.repos.d/elasticsearch.repo
添加以下存储库配置:
/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.7] name=Elasticsearch repository for 1.7.x packages baseurl=http://packages.elastic.co/elasticsearch/1.7/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
保存并退出。
使用以下命令安装 Elasticsearch:
sudo yum -y install elasticsearch
现在已安装 Elasticsearch。 让我们编辑配置:
sudo vi /etc/elasticsearch/elasticsearch.yml
您需要限制对 Elasticsearch 实例(端口 9200)的外部访问,因此外部人员无法通过 HTTP API 读取您的数据或关闭您的 Elasticsearch 集群。 找到指定 network.host
的行,取消注释,并将其值替换为“localhost”,如下所示:
elasticsearch.yml 摘录(更新)
network.host: localhost
保存并退出elasticsearch.yml
。
现在启动 Elasticsearch:
sudo systemctl start elasticsearch
然后运行以下命令以在启动时自动启动 Elasticsearch:
sudo systemctl enable elasticsearch
现在 Elasticsearch 已经启动并运行了,让我们安装 Kibana。
安装 Kibana
Kibana 包与 Elasticsearch 共享相同的 GPG 密钥,我们已经安装了该公钥,所以让我们为 Kibana 创建和编辑一个新的 Yum 存储库文件:
为 Kibana 创建和编辑一个新的 yum 存储库文件:
sudo vi /etc/yum.repos.d/kibana.repo
添加以下存储库配置:
/etc/yum.repos.d/kibana.repo
[kibana-4.1] name=Kibana repository for 4.1.x packages baseurl=http://packages.elastic.co/kibana/4.1/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
保存并退出。
使用以下命令安装 Kibana:
sudo yum -y install kibana
打开 Kibana 配置文件进行编辑:
sudo vi /opt/kibana/config/kibana.yml
在 Kibana 配置文件中,找到指定 host
的行,并将 IP 地址(默认为“0.0.0.0”)替换为“localhost”:
kibana.yml 摘录(更新)
host: "localhost"
保存并退出。 这个设置使得 Kibana 只能被 localhost 访问。 这很好,因为我们将在同一台服务器上安装 Nginx 反向代理,以允许外部访问。
现在启动 Kibana 服务,并启用它:
sudo systemctl start kibana sudo chkconfig kibana on
在我们可以使用 Kibana Web 界面之前,我们必须设置一个反向代理。 现在让我们用 Nginx 来做这件事。
安装 Nginx
因为我们将 Kibana 配置为侦听 localhost
,所以我们必须设置反向代理以允许外部访问它。 为此,我们将使用 Nginx。
注意: 如果您已经有一个 Nginx 实例想要使用,请随意使用它。 只需确保配置 Kibana 以便您的 Nginx 服务器可以访问它(您可能希望将 /opt/kibana/config/kibana.yml
中的 host
值更改为您的 Kibana 服务器的私有 IP 地址)。 此外,建议您启用 SSL/TLS。
将 EPEL 存储库添加到 yum:
sudo yum -y install epel-release
现在使用 yum 安装 Nginx 和 httpd-tools:
sudo yum -y install nginx httpd-tools
使用 htpasswd 创建一个管理员用户,名为“kibanaadmin”(您应该使用其他名称),该用户可以访问 Kibana Web 界面:
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在提示符处输入密码。 请记住此登录名,因为您将需要它来访问 Kibana Web 界面。
现在在您喜欢的编辑器中打开 Nginx 配置文件。 我们将使用 vi:
sudo vi /etc/nginx/nginx.conf
找到默认服务器块(以 server {
开头),文件中的最后一个配置块,然后将其删除。 完成后,文件中的最后两行应如下所示:
nginx.conf 摘录
include /etc/nginx/conf.d/*.conf; }
保存并退出。
现在我们将在一个新文件中创建一个 Nginx 服务器块:
sudo vi /etc/nginx/conf.d/kibana.conf
将以下代码块粘贴到文件中。 请务必更新 server_name
以匹配您的服务器名称:
/etc/nginx/conf.d/kibana.conf
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 流量定向到 Kibana 应用程序,该应用程序正在侦听 localhost:5601
。 此外,Nginx 将使用我们之前创建的 htpasswd.users
文件,并且需要基本身份验证。
现在启动并启用 Nginx 以使我们的更改生效:
sudo systemctl start nginx sudo systemctl enable nginx
注意: 本教程假定 SELinux 已禁用。 如果不是这种情况,您可能需要运行以下命令才能让 Kibana 正常工作:sudo setsebool -P httpd_can_network_connect 1
Kibana 现在可以通过您的 FQDN 或 Logstash 服务器的公共 IP 地址访问,即 http://logstash_server_public_ip/。 如果您在 Web 浏览器中访问该页面,在输入“kibanaadmin”凭据后,您应该会看到一个 Kibana 欢迎页面,该页面将要求您配置索引模式。 在我们安装完所有其他组件之后,让我们稍后再谈。
安装 Logstash
Logstash 包与 Elasticsearch 共享相同的 GPG 密钥,我们已经安装了该公钥,所以让我们为 Logstash 创建和编辑一个新的 Yum 存储库文件:
sudo vi /etc/yum.repos.d/logstash.repo
添加以下存储库配置:
/etc/yum.repos.d/logstash.repo
[logstash-1.5] name=logstash repository for 1.5.x packages baseurl=http://packages.elasticsearch.org/logstash/1.5/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
保存并退出。
使用以下命令安装 Logstash 1.5:
sudo yum -y install logstash
Logstash 已安装,但尚未配置。
生成 SSL 证书
由于我们将使用 Logstash Forwarder 将日志从我们的服务器发送到我们的 Logstash 服务器,因此我们需要创建一个 SSL 证书和密钥对。 Logstash Forwarder 使用该证书来验证 Logstash Server 的身份。
现在您有两个选项可用于生成 SSL 证书。 如果您的 DNS 设置允许您的客户端服务器解析 Logstash 服务器的 IP 地址,请使用 选项 2。 否则,选项 1 将允许您使用 IP 地址。
选项 1:IP 地址
如果您没有 DNS 设置——这将允许您收集日志的服务器来解析 Logstash 服务器的 IP 地址——您必须将 Logstash 服务器的私有 IP 地址添加到 [我们将要生成的 SSL 证书的 X217X] (SAN) 字段。 为此,请打开 OpenSSL 配置文件:
sudo vi /etc/pki/tls/openssl.cnf
在文件中找到 [ v3_ca ]
部分,并在其下添加这一行(替换为 Logstash Server 的私有 IP 地址):
openssl.cnf 摘录
subjectAltName = IP: logstash_server_private_ip
保存并退出。
现在使用以下命令在适当的位置 (/etc/pki/tls/) 生成 SSL 证书和私钥:
cd /etc/pki/tls sudo openssl req -config /etc/pki/tls/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 并继续 Configure Logstash。
选项 2:FQDN (DNS)
如果您的私有网络设置了 DNS,您应该创建一个包含 Logstash 服务器私有 IP 地址的 A 记录——该域名将在下一个命令中使用,以生成 SSL 证书。 或者,您可以使用指向服务器公共 IP 地址的记录。 只需确保您的服务器(您将从其中收集日志的服务器)能够将域名解析到您的 Logstash 服务器。
现在使用以下命令(替换为 Logstash 服务器的 FQDN)在适当的位置(/etc/pki/tls/...)生成 SSL 证书和私钥:
cd /etc/pki/tls sudo openssl req -subj '/CN=logstash_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
Logstash 配置文件采用 JSON 格式,位于 /etc/logstash/conf.d 中。 配置由三个部分组成:输入、过滤器和输出。
让我们创建一个名为 01-lumberjack-input.conf
的配置文件并设置我们的“lumberjack”输入(Logstash Forwarder 使用的协议):
sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
插入以下 input 配置:
/etc/logstash/conf.d/01-lumberjack-input.conf
input { lumberjack { port => 5043 type => "logs" ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
保存并退出。 这指定了一个 lumberjack
输入,它将侦听 tcp 端口 5043
,它将使用我们之前创建的 SSL 证书和私钥。
现在让我们创建一个名为 10-syslog.conf
的配置文件,我们将在其中为 syslog 消息添加一个过滤器:
sudo vi /etc/logstash/conf.d/10-syslog.conf
插入以下 syslog filter 配置:
/etc/logstash/conf.d/10-syslog.conf
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”类型的日志(由 Logstash 转发器),它会尝试使用“grok”来解析传入的 syslog 日志以使其结构化和可查询。
最后,我们将创建一个名为 30-lumberjack-output.conf
的配置文件:
sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf
插入以下 输出 配置:
/etc/logstash/conf.d/30-lumberjack-output.conf
output { elasticsearch { host => localhost } stdout { codec => rubydebug } }
保存并退出。 此输出基本上配置 Logstash 以将日志存储在 Elasticsearch 中。
使用这种配置,Logstash 也会接受与过滤器不匹配的日志,但数据不会被结构化(例如 未过滤的 Nginx 或 Apache 日志将显示为平面消息,而不是按 HTTP 响应代码、源 IP 地址、服务文件等对消息进行分类)。
如果您想为使用 Logstash Forwarder 输入的其他应用程序添加过滤器,请确保为文件命名,以便它们在输入和输出配置之间排序(即 在 01- 和 30- 之间)。
重新启动并启用 Logstash 以使我们的配置更改生效:
sudo systemctl restart logstash
现在我们的 Logstash Server 已经准备就绪,让我们开始设置 Logstash Forwarder。
设置 Logstash 转发器(添加客户端服务器)
为您希望将日志发送到 Logstash 服务器的每个 CentOS 或 RHEL 7 服务器执行这些步骤。 有关在基于 Debian 的 Linux 发行版上安装 Logstash Forwarder 的说明(例如 Ubuntu、Debian 等),请参阅本教程 Ubuntu 变体的 Build and Package Logstash Forwarder 部分。
复制 SSL 证书和 Logstash 转发器包
在 Logstash Server 上,将 SSL 证书复制到 Client Server(替换客户端服务器的 IP 地址和您自己的登录名):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
提供登录凭据后,确保证书复制成功。 客户端服务器和 Logstash 服务器之间的通信需要它。
安装 Logstash 转发器包
在 Client Server 上,创建运行以下命令将 Elasticsearch 公钥 GPG 密钥导入 rpm:
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为 Logstash Forwarder 创建和编辑一个新的 yum 存储库文件:
sudo vi /etc/yum.repos.d/logstash-forwarder.repo
添加以下存储库配置:
/etc/yum.repos.d/logstash-forwarder.repo
[logstash-forwarder] name=logstash-forwarder repository baseurl=http://packages.elastic.co/logstashforwarder/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
保存并退出。
然后安装 Logstash Forwarder 包:
sudo yum -y install logstash-forwarder
现在将 Logstash 服务器的 SSL 证书复制到适当的位置 (/etc/pki/tls/certs):
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
配置 Logstash 转发器
在 Client Server 上,创建并编辑 Logstash Forwarder 配置文件,JSON 格式:
sudo vi /etc/logstash-forwarder.conf
在 network
部分下,将以下行添加到文件中,将 logstash_server_private_IP
替换为 Logstash 服务器的私有 IP 地址:
logstash-forwarder.conf 摘录 1 of 2
"servers": [ "logstash_server_private_IP:5043" ], "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt", "timeout": 15
在 files
部分(方括号之间)下,添加以下行,
logstash-forwarder.conf 摘录 2 of 2
{ "paths": [ "/var/log/messages", "/var/log/secure" ], "fields": { "type": "syslog" } }
保存并退出。 这会将 Logstash Forwarder 配置为在端口 5043(我们之前指定输入的端口)上连接到 Logstash 服务器,并使用我们之前创建的 SSL 证书。 paths 部分指定要发送哪些日志文件(这里我们指定 messages
和 secure
),type 部分指定这些日志属于输入“syslog*”(这是我们的过滤器正在寻找的类型)。
请注意,您可以在此处添加更多文件/类型以将 Logstash 转发器配置到其他日志文件到端口 5043 上的 Logstash。
现在启动并启用 Logstash Forwarder 以将我们的更改落实到位:
sudo systemctl start logstash-forwarder sudo chkconfig logstash-forwarder on
现在 Logstash Forwarder 正在将您的系统日志 messages
和 secure
文件发送到您的 Logstash 服务器! 对您希望为其收集日志的所有其他服务器重复此部分。
连接到 Kibana
当您在要为其收集日志的所有服务器上设置完 Logstash Forwarder 后,让我们看看 Kibana,我们之前安装的 Web 界面。
在 Web 浏览器中,转到 Logstash 服务器的 FQDN 或公共 IP 地址。 输入“kibanaadmin”凭据后,您应该会看到一个提示您配置索引模式的页面:
继续并从下拉菜单中选择 @timestamp,然后单击 Create 按钮创建第一个索引。
现在单击顶部导航栏中的 Discover 链接。 默认情况下,这将显示过去 15 分钟内的所有日志数据。 您应该看到带有日志事件的直方图,日志消息如下:
现在,那里不会有太多内容,因为您只是从客户端服务器收集系统日志。 在这里,您可以搜索和浏览您的日志。 您还可以自定义仪表板。
尝试以下操作:
- 搜索“root”以查看是否有人试图以 root 身份登录您的服务器
- 搜索特定主机名(搜索
host: "hostname"
) - 通过选择直方图上的一个区域或从上面的菜单中更改时间范围
- 单击直方图下方的消息以查看数据是如何被过滤的
Kibana 还有许多其他功能,例如图形和过滤,所以请随意浏览!
结论
现在您的系统日志通过 Elasticsearch 和 Logstash 集中,并且您可以使用 Kibana 将它们可视化,您应该从集中所有重要日志开始。 请记住,您几乎可以将任何类型的日志发送到 Logstash,但如果使用 grok 对其进行解析和结构化,数据将变得更加有用。
要改进新的 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤其他日志,并创建 Kibana 仪表板。 这些主题将在本系列的第二和第三篇教程中介绍。 此外,如果您在设置时遇到问题,请按照我们的 如何解决常见的 ELK 堆栈问题 教程进行操作。
向下滚动链接以了解有关使用 ELK 堆栈的更多信息!