如何在 Ubuntu 14.04 上安装 Elasticsearch、Logstash 和 Kibana (ELK Stack)
介绍
在本教程中,我们将在 Ubuntu 14.04(即 Elasticsearch 2.2.x、Logstash 2.2.x 和 Kibana 4.5.x)上安装 Elasticsearch ELK Stack。我们还将向您展示如何配置它以使用 Filebeat 1.1.x 在集中位置收集和可视化系统的系统日志。 Logstash 是一个开源工具,用于收集、解析和存储日志以备将来使用。 Kibana 是一个 Web 界面,可用于搜索和查看 Logstash 已编制索引的日志。这两个工具都基于 Elasticsearch,用于存储日志。
集中式日志记录在尝试识别服务器或应用程序问题时非常有用,因为它允许您在一个地方搜索所有日志。它也很有用,因为它允许您通过关联特定时间范围内的日志来识别跨越多个服务器的问题。
可以使用 Logstash 收集所有类型的日志,但我们将本教程的范围限制为系统日志收集。
我们的目标
本教程的目标是设置 Logstash 以收集多个服务器的系统日志,并设置 Kibana 以可视化收集的日志。
我们的 ELK 堆栈设置有四个主要组件:
- Logstash:Logstash 的服务器组件,用于处理传入的日志
- Elasticsearch:存储所有日志
- Kibana:用于搜索和可视化日志的 Web 界面,将通过 Nginx 代理
- Filebeat:安装在将日志发送到 Logstash 的客户端服务器上,Filebeat 用作日志传送代理,利用 lumberjack 网络协议与 Logstash 通信

我们将在单个服务器上安装前三个组件,我们将其称为我们的 ELK 服务器。 Filebeat 将安装在我们要为其收集日志的所有客户端服务器上,我们将统称为我们的客户端服务器。
先决条件
要完成本教程,您需要 root 访问 Ubuntu 14.04 VPS。可以在此处找到设置说明(步骤 3 和 4):Initial Server Setup with Ubuntu 14.04。
如果您更喜欢使用 CentOS,请查看本教程:如何在 CentOS 7 上安装 ELK。
您的 ELK 服务器需要的 CPU、RAM 和存储量取决于您打算收集的日志量。对于本教程,我们将为我们的 ELK 服务器使用具有以下规格的 VPS:
- 操作系统:Ubuntu 14.04
- 内存:4GB
- 中央处理器:2
除了您的 ELK 服务器之外,您还需要一些其他服务器来收集日志。
让我们开始设置我们的 ELK 服务器吧!
安装 Java 8
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。
安装 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
弹性搜索现已安装。让我们编辑配置:
- sudo vi /etc/elasticsearch/elasticsearch.yml
您需要限制外部访问您的 Elasticsearch 实例(端口 9200),这样外部人员就无法通过 HTTP API 读取您的数据或关闭您的 Elasticsearch 集群。找到指定 network.host
的行,取消注释,并将其值替换为 \localhost”,如下所示:
network.host: localhost
保存并退出 elasticsearch.yml
。
现在启动 Elasticsearch:
- sudo service elasticsearch restart
然后运行以下命令以在启动时启动 Elasticsearch:
- sudo update-rc.d elasticsearch defaults 95 10
现在 Elasticsearch 已启动并运行,让我们安装 Kibana。
安装 Kibana
通过添加 Elastic 的包源列表,可以使用包管理器安装 Kibana。
创建 Kibana 源列表:
- echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.5.x.list
更新您的 apt 包数据库:
- sudo apt-get update
使用此命令安装 Kibana:
- sudo apt-get -y install kibana
Kibana 现已安装。
打开 Kibana 配置文件进行编辑:
- sudo vi /opt/kibana/config/kibana.yml
在 Kibana 配置文件中,找到指定 server.host
的行,并将 IP 地址(默认为 \0.0.0.0)替换为 \localhost:
server.host: "localhost"
保存并退出。此设置使得 Kibana 只能由本地主机访问。这很好,因为我们将使用 Nginx 反向代理来允许外部访问。
现在启用 Kibana 服务,并启动它:
- sudo update-rc.d kibana defaults 96 9
- sudo service kibana start
在我们使用 Kibana Web 界面之前,我们必须设置一个反向代理。让我们现在用 Nginx 来做吧。
安装 Nginx
因为我们将 Kibana 配置为监听 localhost
,所以我们必须设置反向代理以允许外部访问它。为此,我们将使用 Nginx。
注意:如果您已经有一个要使用的 Nginx 实例,请随意使用它。只需确保配置 Kibana,以便您的 Nginx 服务器可以访问它(您可能想更改 /opt/kibana/config/kibana.yml
中的 host
值,到您的 Kibana 服务器的私有 IP 地址或主机名)。此外,建议您启用 SSL/TLS。
使用 apt 安装 Nginx 和 Apache2-utils:
- sudo apt-get install nginx apache2-utils
使用 htpasswd 创建一个管理员用户,名为 \kibanaadmin(你应该使用另一个名称),可以访问 Kibana web 界面:
- sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
在提示符下输入密码。请记住此登录名,因为您将需要它来访问 Kibana Web 界面。
现在在您喜欢的编辑器中打开 Nginx 默认服务器块。我们将使用 vi:
- sudo vi /etc/nginx/sites-available/default
删除文件的内容,并将以下代码块粘贴到文件中。请务必更新 server_name
以匹配您的服务器名称:
- 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 service nginx restart
现在可以通过您的 FQDN 或您的 ELK 服务器的公共 IP 地址访问 Kibana,即 http://elk-server-public-ip/。如果您在 Web 浏览器中进入那里,在输入 \kibanaadmin 凭据后,您应该会看到一个 Kibana 欢迎页面,它会要求您配置索引模式。让我们稍后再回来,在我们安装所有其他组件之后.
安装 Logstash
Logstash 包可从与 Elasticsearch 相同的存储库中获得,我们已经安装了该公钥,所以让我们创建 Logstash 源列表:
- echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
更新您的 apt 包数据库:
- sudo apt-get update
使用此命令安装 Logstash:
- sudo apt-get install logstash
Logstash 已安装但尚未配置。
生成 SSL 证书
由于我们要使用 Filebeat 将日志从我们的客户端服务器发送到我们的 ELK 服务器,因此我们需要创建一个 SSL 证书和密钥对。 Filebeat 使用该证书来验证 ELK Server 的身份。使用以下命令创建将存储证书和私钥的目录:
- sudo mkdir -p /etc/pki/tls/certs
- sudo mkdir /etc/pki/tls/private
现在您有两种生成 SSL 证书的选项。如果您的 DNS 设置允许您的客户端服务器解析 ELK 服务器的 IP 地址,请使用选项 2。否则,选项 1 将允许您使用 IP 地址。
选项 1:IP 地址
如果您没有 DNS 设置——这将允许您的服务器(您将从中收集日志)解析您的 ELK 服务器的 IP 地址——您将必须将您的 ELK 服务器的私有 IP 地址添加到 subjectAltName
我们将要生成的 SSL 证书的 (SAN) 字段。为此,请打开 OpenSSL 配置文件:
- sudo vi /etc/ssl/openssl.cnf
找到文件中的 [ v3_ca ]
部分,并在其下添加这一行(替换为 ELK Server 的私有 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。
选项 2:FQDN (DNS)
如果你的私人网络有 DNS 设置,你应该创建一个包含 ELK 服务器私人 IP 地址的 A 记录——这个域名将在下一个命令中使用,以生成 SSL 证书。或者,您可以使用指向服务器公共 IP 地址的记录。只需确保您的服务器(您将从中收集日志的服务器)能够将域名解析为您的 ELK 服务器。
现在在适当的位置(/etc/pki/tls/…)生成 SSL 证书和私钥,使用以下命令(替换为 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
Logstash 配置文件采用 JSON 格式,位于 /etc/logstash/conf.d 中。配置由三个部分组成:输入、过滤器和输出。
让我们创建一个名为 02-beats-input.conf
的配置文件并设置我们的“filebeat”输入:
- sudo vi /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"
- }
- }
保存并退出。这指定了将在 tcp 端口 5044
上侦听的 beats
输入,并且它将使用我们之前创建的 SSL 证书和私钥。
现在让我们创建一个名为 10-syslog-filter.conf
的配置文件,我们将在其中添加系统日志消息的过滤器:
- sudo vi /etc/logstash/conf.d/10-syslog-filter.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 类型(由 Filebeat)的日志,并且它将尝试使用 grok
来解析传入的 syslog 日志,以使其结构化和可查询。
最后,我们将创建一个名为 30-elasticsearch-output.conf
的配置文件:
- sudo vi /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 配置为将节拍数据存储在运行于 localhost:9200
的 Elasticsearch 中,在以使用的节拍(在我们的示例中为 filebeat)命名的索引中。
如果您想为使用 Filebeat 输入的其他应用程序添加过滤器,请务必命名文件,以便它们在输入和输出配置之间排序(即在 02- 和 30- 之间)。
使用此命令测试您的 Logstash 配置:
- sudo service logstash configtest
如果没有语法错误,它应该显示 Configuration OK
。否则,请尝试阅读错误输出以查看您的 Logstash 配置有什么问题。
重新启动 Logstash 并启用它,以使我们的配置更改生效:
- sudo service logstash restart
- sudo update-rc.d logstash defaults 96 9
接下来,我们将加载示例 Kibana 仪表板。
加载 Kibana 仪表板
Elastic 提供了多个示例 Kibana 仪表板和 Beats 索引模式,可以帮助您开始使用 Kibana。虽然我们不会在本教程中使用仪表板,但无论如何我们都会加载它们,以便我们可以使用它包含的 Filebeat 索引模式。
首先,将示例仪表板存档下载到您的主目录:
- cd ~
- curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
使用以下命令安装 unzip
包:
- sudo apt-get -y install unzip
接下来,提取存档的内容:
- unzip beats-dashboards-*.zip
并使用以下命令将示例仪表板、可视化和 Beats 索引模式加载到 Elasticsearch 中:
- cd beats-dashboards-*
- ./load.sh
这些是我们刚刚加载的索引模式:
- [packetbeat-]YYYY.MM.DD
- [topbeat-]YYYY.MM.DD
- [filebeat-]YYYY.MM.DD
- [winlogbeat-]YYYY.MM.DD
当我们开始使用 Kibana 时,我们将选择 Filebeat 索引模式作为我们的默认模式。
在 Elasticsearch 中加载 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
如果模板加载正确,您应该会看到如下消息:
Output:{
"acknowledged" : true
}
现在我们的 ELK 服务器已准备好接收 Filebeat 数据,让我们继续在每个客户端服务器上设置 Filebeat。
设置 Filebeat(添加客户端服务器)
对要将日志发送到 ELK 服务器上的 Logstash 的每个 Ubuntu 或 Debian 服务器执行这些步骤。有关在基于 Red Hat 的 Linux 发行版(例如 RHEL、CentOS 等)上安装 Filebeat 的说明,请参阅本教程 CentOS 变体的设置 Filebeat(添加客户端服务器)部分。
复制 SSL 证书
在您的 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 包。
安装 Filebeat 包
在客户端服务器上,创建 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 附带的示例配置文件。完成这些步骤后,您应该有一个看起来像这样的文件。
在 Client Server 上,创建和编辑 Filebeat 配置文件:
- sudo vi /etc/filebeat/filebeat.yml
注意:Filebeat的配置文件是YAML格式,也就是说缩进很重要!请务必使用与这些说明中指示的相同数量的空格。
在文件顶部附近,您将看到 prospectors
部分,您可以在其中定义 prospector,指定应传送哪些日志文件以及应如何处理它们。每个探矿者都由 -
字符表示。
我们将修改现有的 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
...
这指定此探矿器中的日志属于 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
条目下,并使用相同的缩进,添加以下行:
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 service filebeat restart
- sudo update-rc.d filebeat defaults 95 10
同样,如果您不确定您的 Filebeat 配置是否正确,请将其与此示例 Filebeat 配置进行比较。
现在 Filebeat 正在将 syslog
和 auth.log
发送到您的 ELK 服务器上的 Logstash!对您希望为其收集日志的所有其他服务器重复此部分。
测试 Filebeat 安装
如果您的 ELK 堆栈设置正确,Filebeat(在您的客户端服务器上)应该将您的日志传送到您的 ELK 服务器上的 Logstash。 Logstash 应该将 Filebeat 数据加载到带有日期戳的索引中的 Elasticsearch,filebeat-YYYY.MM.DD
。
在您的 ELK 服务器上,通过使用以下命令查询 Filebeat 索引来验证 Elasticsearch 确实在接收数据:
- curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
您应该会看到一堆如下所示的输出:
Sample Output:...
{
"_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 未在您搜索的索引下加载任何日志,您应该检查您的设置是否有错误。如果您收到预期的输出,请继续执行下一步。
连接到 Kibana
当您在所有要为其收集日志的服务器上完成 Filebeat 的设置后,让我们看看我们之前安装的 Web 界面 Kibana。
在 Web 浏览器中,转到您的 ELK 服务器的 FQDN 或公共 IP 地址。输入“kibanaadmin”凭据后,您应该会看到一个页面,提示您配置默认索引模式:

继续并从 Index Patterns 菜单(左侧)中选择 [filebeat]-YYY.MM.DD,然后单击 Star(设置为默认索引)按钮将 Filebeat 索引设置为默认值。
现在单击顶部导航栏中的发现链接。默认情况下,这将显示过去 15 分钟内的所有日志数据。您应该会看到带有日志事件的直方图,日志消息如下:

现在,那里不会有太多内容,因为您只是从客户端服务器收集系统日志。在这里,您可以搜索和浏览您的日志。您还可以自定义仪表板。
尝试以下操作:
- 搜索“root”以查看是否有人试图以 root 身份登录您的服务器
- 搜索特定主机名(搜索
host: hostname
) - 通过在直方图上或从上面的菜单中选择一个区域来更改时间范围
- 单击直方图下方的消息以查看数据是如何被过滤的
Kibana 还有许多其他功能,例如绘图和过滤,所以请随意浏览!
结论
既然您的系统日志是通过 Elasticsearch 和 Logstash 集中的,并且您可以使用 Kibana 将它们可视化,那么您应该开始集中所有重要的日志。请记住,您几乎可以将任何类型的日志或索引数据发送到 Logstash,但如果使用 grok 对其进行解析和结构化,数据将变得更加有用。
要改进您的新 ELK 堆栈,您应该考虑使用 Logstash 收集和过滤您的其他日志,并通过将 Topbeat 与您的 ELK 堆栈一起使用来收集系统指标。所有这些主题都包含在本系列的其他教程中。
祝你好运!