如何在Ubuntu20.04上安装Elasticsearch、Logstash和Kibana(ElasticStack)
介绍
Elastic Stack — 以前称为 ELK Stack — 是由 Elastic 制作的开源软件集合,它允许您搜索、分析和可视化从任何来源生成的日志任何格式,一种称为 集中式日志记录 的做法。 在尝试识别服务器或应用程序的问题时,集中式日志记录非常有用,因为它允许您在一个地方搜索所有日志。 它也很有用,因为它允许您通过在特定时间范围内关联它们的日志来识别跨多个服务器的问题。
Elastic Stack 有四个主要组件:
- Elasticsearch:一个分布式的 RESTful 搜索引擎,存储所有收集的数据。
- Logstash:Elastic Stack 的数据处理组件,将传入数据发送到 Elasticsearch。
- Kibana:用于搜索和可视化日志的 Web 界面。
- Beats:轻量级、单一用途的数据传送器,可以将数据从数百或数千台机器发送到 Logstash 或 Elasticsearch。
在本教程中,您将在 Ubuntu 20.04 服务器上安装 Elastic Stack。 您将学习如何安装 Elastic Stack 的所有组件——包括 Filebeat,一种用于转发和集中日志和文件的 Beat——并配置它们以收集和可视化系统日志。 此外,由于 Kibana 通常仅在 localhost
上可用,因此我们将使用 Nginx 对其进行代理,以便可以通过 Web 浏览器访问它。 我们将在单个服务器上安装所有这些组件,我们将其称为 Elastic Stack 服务器。
注意:安装Elastic Stack时,必须在整个堆栈中使用相同的版本。 在本教程中,我们将安装整个堆栈的最新版本,在撰写本文时,它们是 Elasticsearch 7.7.1、Kibana 7.7.1、Logstash 7.7.1 和 Filebeat 7.7.1。
先决条件
要完成本教程,您将需要以下内容:
- 具有 4GB RAM 和 2 个 CPU 的 Ubuntu 20.04 服务器,由非 root sudo 用户设置。 您可以按照 Initial Server Setup with Ubuntu 20.04 来实现这一点。在本教程中,我们将使用运行 Elasticsearch 所需的最少 CPU 和 RAM。 请注意,您的 Elasticsearch 服务器所需的 CPU、RAM 和存储量取决于您期望的日志量。
- 已安装 OpenJDK 11。 See the section [Installing the Default JRE/JDK](how-to-install-java-with-apt-on-ubuntu-20-04#installing-the-default-jrejdk in our guide How To Install Java with Apt on Ubuntu 20.04 to set this up.
- Nginx 安装在您的服务器上,我们将在本指南后面将其配置为 Kibana 的反向代理。 按照我们关于 如何在 Ubuntu 20.04 上安装 Nginx 的指南进行设置。
此外,由于 Elastic Stack 用于访问您不希望未经授权的用户访问的有关您的服务器的有价值信息,因此通过安装 TLS/SSL 证书来确保您的服务器安全非常重要。 这是可选的,但 强烈建议 。
但是,由于您最终将在本指南的过程中更改您的 Nginx 服务器块,因此在本教程的第二部分结束时完成 Let's Encrypt on Ubuntu 20.04 指南可能更有意义步。 考虑到这一点,如果您计划在您的服务器上配置 Let's Encrypt,在这样做之前您需要准备好以下内容:
- 完全限定域名 (FQDN)。 本教程将自始至终使用
your_domain
。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。 您可以关注这个DigitalOcean DNS的介绍,详细了解如何添加它们。
- 带有
your_domain
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.your_domain
的 A 记录指向您服务器的公共 IP 地址。
- 带有
第 1 步 — 安装和配置 Elasticsearch
Elasticsearch 组件在 Ubuntu 的默认软件包存储库中不可用。 但是,它们可以在添加 Elastic 的包源列表后与 APT 一起安装。
所有软件包都使用 Elasticsearch 签名密钥进行签名,以保护您的系统免受软件包欺骗。 已使用密钥进行身份验证的包将被您的包管理器视为信任。 在此步骤中,您将导入 Elasticsearch 公共 GPG 密钥并添加 Elastic 包源列表以安装 Elasticsearch。
首先,使用 cURL(用于通过 URL 传输数据的命令行工具)将 Elasticsearch 公钥 GPG 密钥导入 APT。 请注意,我们使用参数 -fsSL 来消除所有进度和可能的错误(服务器故障除外),并允许 cURL 在重定向时在新位置发出请求。 将 cURL 命令的输出通过管道传输到 apt-key 程序中,该程序将公共 GPG 密钥添加到 APT。
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
接下来,将 Elastic 源列表添加到 sources.list.d
目录,APT 将在该目录中搜索新源:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
接下来,更新您的软件包列表,以便 APT 读取新的 Elastic 源:
sudo apt update
然后使用以下命令安装 Elasticsearch:
sudo apt install elasticsearch
Elasticsearch 现在已安装并准备好进行配置。 使用您喜欢的文本编辑器编辑 Elasticsearch 的主配置文件 elasticsearch.yml
。 在这里,我们将使用 nano
:
sudo nano /etc/elasticsearch/elasticsearch.yml
注意: Elasticsearch的配置文件是YAML格式,也就是说我们需要维护缩进格式。 确保在编辑此文件时不要添加任何额外的空格。
elasticsearch.yml
文件为您的集群、节点、路径、内存、网络、发现和网关提供配置选项。 大多数这些选项都在文件中预先配置,但您可以根据需要更改它们。 为了演示单服务器配置,我们将仅调整网络主机的设置。
Elasticsearch 在端口 9200
上侦听来自各处的流量。 您需要限制对 Elasticsearch 实例的外部访问,以防止外部人员通过其 [REST API] 读取您的数据或关闭您的 Elasticsearch 集群(https://en.wikipedia.org/wiki/Representational_state_transfer )。 要限制访问并因此提高安全性,请找到指定 network.host
的行,取消注释,然后将其值替换为 localhost
,如下所示:
/etc/elasticsearch/elasticsearch.yml
. . . # ---------------------------------- Network ----------------------------------- # # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: localhost . . .
我们指定了 localhost
以便 Elasticsearch 监听所有接口和绑定 IP。 如果您希望它仅在特定接口上侦听,则可以指定其 IP 代替 localhost
。 保存并关闭 elasticsearch.yml
。 如果您使用的是 nano
,您可以按 CTRL+X
,然后按 Y
,然后按 ENTER
。
这些是您可以开始使用 Elasticsearch 的最低设置。 现在您可以第一次启动 Elasticsearch。
使用 systemctl
启动 Elasticsearch 服务。 给 Elasticsearch 一点启动时间。 否则,您可能会收到有关无法连接的错误。
sudo systemctl start elasticsearch
接下来,运行以下命令以使 Elasticsearch 在每次服务器启动时启动:
sudo systemctl enable elasticsearch
您可以通过发送 HTTP 请求来测试您的 Elasticsearch 服务是否正在运行:
curl -X GET "localhost:9200"
您将看到显示有关本地节点的一些基本信息的响应,类似于以下内容:
Output{ "name" : "Elasticsearch", "cluster_name" : "elasticsearch", "cluster_uuid" : "qqhFHPigQ9e2lk-a7AvLNQ", "version" : { "number" : "7.7.1", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.5.1", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
现在 Elasticsearch 已经启动并运行,让我们安装 Kibana,Elastic Stack 的下一个组件。
第 2 步 — 安装和配置 Kibana 仪表板
根据官方文档,安装好Elasticsearch后才需要安装Kibana。 按此顺序安装可确保每个产品所依赖的组件正确就位。
因为您已经在上一步中添加了 Elastic 包源,所以您可以使用 apt
安装 Elastic Stack 的其余组件:
sudo apt install kibana
然后启用并启动 Kibana 服务:
sudo systemctl enable kibana sudo systemctl start kibana
因为 Kibana 被配置为只监听 localhost
,我们必须设置一个 反向代理 以允许外部访问它。 我们将为此目的使用 Nginx,它应该已经安装在您的服务器上。
首先,使用 openssl
命令创建一个管理 Kibana 用户,您将使用该用户访问 Kibana Web 界面。 例如,我们将此帐户命名为 kibanaadmin
,但为了确保更高的安全性,我们建议您为用户选择一个难以猜测的非标准名称。
以下命令将创建管理 Kibana 用户和密码,并将它们存储在 htpasswd.users
文件中。 您将配置 Nginx 以要求此用户名和密码并立即读取此文件:
echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
在提示符处输入并确认密码。 记住或记下此登录信息,因为您将需要它来访问 Kibana Web 界面。
接下来,我们将创建一个 Nginx 服务器块文件。 例如,我们将此文件称为 your_domain
,尽管您可能会发现给您的文件起一个更具描述性的名称会有所帮助。 例如,如果您为此服务器设置了 FQDN 和 DNS 记录,则可以在 FQDN 之后命名此文件。
使用 nano 或您喜欢的文本编辑器,创建 Nginx 服务器块文件:
sudo nano /etc/nginx/sites-available/your_domain
将以下代码块添加到文件中,确保更新 your_domain
以匹配您服务器的 FQDN 或公共 IP 地址。 此代码将 Nginx 配置为将服务器的 HTTP 流量定向到 Kibana 应用程序,该应用程序正在侦听 localhost:5601
。 此外,它将 Nginx 配置为读取 htpasswd.users
文件并需要基本身份验证。
请注意,如果您一直遵循 先决条件 Nginx 教程 到最后,您可能已经创建了此文件并在其中填充了一些内容。 在这种情况下,请在添加以下内容之前删除文件中的所有现有内容:
/etc/nginx/sites-available/your_domain
server { listen 80; server_name your_domain; 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; } }
完成后,保存并关闭文件。
接下来,通过创建指向 sites-enabled
目录的符号链接来启用新配置。 如果您已经在 Nginx 必备项中创建了同名的服务器块文件,则无需运行此命令:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
然后检查配置是否有语法错误:
sudo nginx -t
如果在您的输出中报告了任何错误,请返回并仔细检查您放置在配置文件中的内容是否已正确添加。 在输出中看到 syntax is ok
后,继续并重新启动 Nginx 服务:
sudo systemctl reload nginx
如果您遵循初始服务器设置指南,则应该启用 UFW 防火墙。 要允许连接到 Nginx,我们可以通过键入以下内容来调整规则:
sudo ufw allow 'Nginx Full'
注意: 如果您遵循先决条件 Nginx 教程,您可能已经创建了允许 Nginx HTTP
配置文件通过防火墙的 UFW 规则。 由于 Nginx Full
配置文件允许 HTTP 和 HTTPS 流量通过防火墙,因此您可以安全地删除在先决条件教程中创建的规则。 使用以下命令执行此操作:
sudo ufw delete allow 'Nginx HTTP'
现在可以通过您的 FQDN 或 Elastic Stack 服务器的公共 IP 地址访问 Kibana。 您可以通过导航到以下地址并在出现提示时输入您的登录凭据来检查 Kibana 服务器的状态页面:
http://your_domain/status
此状态页面显示有关服务器资源使用情况的信息并列出已安装的插件。
注意:如前提条件部分所述,建议您在服务器上启用 SSL/TLS。 您现在可以按照 Let's Encrypt 指南获取适用于 Ubuntu 20.04 上 Nginx 的免费 SSL 证书。 获得 SSL/TLS 证书后,您可以返回并完成本教程。
现在 Kibana 仪表板已配置完毕,让我们安装下一个组件:Logstash。
第 3 步 — 安装和配置 Logstash
虽然 Beats 可以将数据直接发送到 Elasticsearch 数据库,但通常使用 Logstash 来处理数据。 这将使您能够更灵活地从不同来源收集数据,将其转换为通用格式,并将其导出到另一个数据库。
使用以下命令安装 Logstash:
sudo apt install logstash
安装 Logstash 后,您可以继续进行配置。 Logstash 的配置文件位于 /etc/logstash/conf.d
目录中。 有关配置语法的更多信息,您可以查看 Elastic 提供的 配置参考 。 在配置文件时,将 Logstash 视为一个管道,它在一端接收数据,以一种或另一种方式处理它,然后将其发送到它的目的地(在这种情况下,目的地是 Elasticsearch),这会很有帮助。 Logstash 管道有两个必需元素 input
和 output
,以及一个可选元素 filter
。 输入插件使用来自源的数据,过滤器插件处理数据,输出插件将数据写入目的地。
创建一个名为 02-beats-input.conf
的配置文件,您将在其中设置 Filebeat 输入:
sudo nano /etc/logstash/conf.d/02-beats-input.conf
插入以下 input
配置。 这指定将侦听 TCP 端口 5044
的 beats
输入。
/etc/logstash/conf.d/02-beats-input.conf
input { beats { port => 5044 } }
保存并关闭文件。
接下来,创建一个名为 30-elasticsearch-output.conf
的配置文件:
sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf
插入以下 output
配置。 本质上,此输出将 Logstash 配置为将 Beats 数据存储在 Elasticsearch 中,Elasticsearch 在 localhost:9200
上运行,以使用的 Beat 命名的索引中。 本教程中使用的 Beat 是 Filebeat:
/etc/logstash/conf.d/30-elasticsearch-output.conf
output { if [@metadata][pipeline] { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" pipeline => "%{[@metadata][pipeline]}" } } else { elasticsearch { hosts => ["localhost:9200"] manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } }
保存并关闭文件。
使用以下命令测试您的 Logstash 配置:
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
如果没有语法错误,您的输出将在几秒钟后显示 Config Validation Result: OK. Exiting Logstash
。 如果您在输出中没有看到这一点,请检查输出中记录的任何错误并更新您的配置以更正它们。 请注意,您将收到来自 OpenJDK 的警告,但它们不应导致任何问题并且可以忽略。
如果您的配置测试成功,请启动并启用 Logstash 以使配置更改生效:
sudo systemctl start logstash sudo systemctl enable logstash
现在 Logstash 运行正常并且配置齐全,让我们安装 Filebeat。
第 4 步 — 安装和配置 Filebeat
Elastic Stack 使用几个称为 Beats 的轻量级数据传送器从各种来源收集数据并将它们传输到 Logstash 或 Elasticsearch。 以下是 Elastic 目前提供的 Beats:
- Filebeat:收集和发送日志文件。
- Metricbeat:从您的系统和服务中收集指标。
- Packetbeat:收集和分析网络数据。
- Winlogbeat:收集 Windows 事件日志。
- Auditbeat:收集Linux审计框架数据,监控文件完整性。
- Heartbeat:通过主动探测监控服务的可用性。
在本教程中,我们将使用 Filebeat 将本地日志转发到我们的 Elastic Stack。
使用 apt
安装 Filebeat:
sudo apt install filebeat
接下来,配置 Filebeat 以连接到 Logstash。 在这里,我们将修改 Filebeat 自带的示例配置文件。
打开 Filebeat 配置文件:
sudo nano /etc/filebeat/filebeat.yml
注意: 和 Elasticsearch 一样,Filebeat 的配置文件是 YAML 格式。 这意味着正确的缩进至关重要,因此请务必使用这些说明中指示的相同数量的空格。
Filebeat 支持多种输出,但您通常只会将事件直接发送到 Elasticsearch 或 Logstash 以进行额外处理。 在本教程中,我们将使用 Logstash 对 Filebeat 收集的数据进行额外处理。 Filebeat 不需要直接向 Elasticsearch 发送任何数据,所以让我们禁用该输出。 为此,请找到 output.elasticsearch
部分并通过在以下行前面加上 #
来注释掉它们:
/etc/filebeat/filebeat.yml
... #output.elasticsearch: # Array of hosts to connect to. #hosts: ["localhost:9200"] ...
然后,配置 output.logstash
部分。 通过删除 #
取消注释 output.logstash:
和 hosts: ["localhost:5044"]
行。 这会将 Filebeat 配置为连接到 Elastic Stack 服务器上的端口 5044
上的 Logstash,我们之前指定了 Logstash 输入的端口:
/etc/filebeat/filebeat.yml
output.logstash: # The Logstash hosts hosts: ["localhost:5044"]
保存并关闭文件。
Filebeat 的功能可以通过 Filebeat 模块 进行扩展。 在本教程中,我们将使用 system 模块,它收集和解析由常见 Linux 发行版的系统日志服务创建的日志。
让我们启用它:
sudo filebeat modules enable system
您可以通过运行以下命令查看启用和禁用模块的列表:
sudo filebeat modules list
您将看到类似于以下内容的列表:
OutputEnabled: system Disabled: apache2 auditd elasticsearch icinga iis kafka kibana logstash mongodb mysql nginx osquery postgresql redis traefik
默认情况下,Filebeat 配置为使用系统日志和授权日志的默认路径。 在本教程的情况下,您不需要更改配置中的任何内容。 在【X49X】【X53X】配置文件中可以看到模块的参数。
接下来,我们需要设置 Filebeat 摄取管道,该管道在将日志数据通过 logstash 发送到 elasticsearch 之前对其进行解析。 要加载系统模块的摄取管道,请输入以下命令:
sudo filebeat setup --pipelines --modules system
接下来,将索引模板加载到 Elasticsearch 中。 Elasticsearch 索引 是具有相似特征的文档的集合。 索引用一个名称标识,用于在其中执行各种操作时引用索引。 创建新索引时将自动应用索引模板。
要加载模板,请使用以下命令:
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]'
OutputIndex setup finished.
Filebeat 附带了示例 Kibana 仪表板,可让您在 Kibana 中可视化 Filebeat 数据。 在使用仪表板之前,您需要创建索引模式并将仪表板加载到 Kibana 中。
随着仪表板的加载,Filebeat 连接到 Elasticsearch 以检查版本信息。 要在启用 Logstash 时加载仪表板,您需要禁用 Logstash 输出并启用 Elasticsearch 输出:
sudo filebeat setup -E output.logstash.enabled=false -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601
您应该会收到与此类似的输出:
OutputOverwriting ILM policy is disabled. Set `setup.ilm.overwrite:true` for enabling. Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead. See more: https://www.elastic.co/guide/en/elastic-stack-overview/current/xpack-ml.html Loaded machine learning job configurations Loaded Ingest pipelines
现在您可以启动并启用 Filebeat:
sudo systemctl start filebeat sudo systemctl enable filebeat
如果您正确设置了 Elastic Stack,Filebeat 将开始将您的系统日志和授权日志传送到 Logstash,然后将这些数据加载到 Elasticsearch。
要验证 Elasticsearch 确实在接收此数据,请使用以下命令查询 Filebeat 索引:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
您应该会收到与此类似的输出:
Output... { { "took" : 4, "timed_out" : false, "_shards" : { "total" : 2, "successful" : 2, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4040, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "filebeat-7.7.1-2020.06.04", "_type" : "_doc", "_id" : "FiZLgXIB75I8Lxc9ewIH", "_score" : 1.0, "_source" : { "cloud" : { "provider" : "digitalocean", "instance" : { "id" : "194878454" }, "region" : "nyc1" }, "@timestamp" : "2020-06-04T21:45:03.995Z", "agent" : { "version" : "7.7.1", "type" : "filebeat", "ephemeral_id" : "cbcefb9a-8d15-4ce4-bad4-962a80371ec0", "hostname" : "june-ubuntu-20-04-elasticstack", "id" : "fbd5956f-12ab-4227-9782-f8f1a19b7f32" }, ...
如果您的输出显示总命中数为 0,则 Elasticsearch 没有在您搜索的索引下加载任何日志,您需要检查您的设置是否有错误。 如果您收到了预期的输出,请继续执行下一步,我们将在其中了解如何浏览 Kibana 的一些仪表板。
第 5 步 — 探索 Kibana 仪表板
让我们回到之前安装的 Kibana Web 界面。
在 Web 浏览器中,转到 Elastic Stack 服务器的 FQDN 或公共 IP 地址。 输入您在第 2 步中定义的登录凭据后,您将看到 Kibana 主页:
单击左侧导航栏中的 Discover 链接(您可能必须单击左下角的 Expand 图标才能查看导航菜单项)。 在 Discover 页面上,选择预定义的 filebeat-* 索引模式以查看 Filebeat 数据。 默认情况下,这将显示过去 15 分钟内的所有日志数据。 您将看到一个带有日志事件的直方图,以及下面的一些日志消息:
在这里,您可以搜索和浏览您的日志,还可以自定义您的仪表板。 不过,此时不会有太多内容,因为您只是从 Elastic Stack 服务器收集系统日志。
使用左侧面板导航到 Dashboard 页面并搜索 Filebeat System 仪表板。 在那里,您可以选择 Filebeat 的 system
模块附带的示例仪表板。
例如,您可以根据系统日志消息查看详细统计信息:
您还可以查看哪些用户使用了 sudo
命令以及何时使用:
Kibana 还有许多其他功能,例如图形和过滤,因此请随意探索。
结论
在本教程中,您学习了如何安装和配置 Elastic Stack 以收集和分析系统日志。 请记住,您可以使用 Beats 将几乎任何类型的日志或索引数据发送到 Logstash,但是如果使用 Logstash 过滤器对其进行解析和结构化,数据将变得更加有用,因为这会将数据转换为可以被 Elasticsearch 轻松读取的一致格式。