介绍
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 通常只在 .x 上可用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 用户。您可以通过使用 Ubuntu 20.04执行初始服务器设置来实现这一点。在本教程中,我们将使用运行 Elasticsearch 所需的最少 CPU 和 RAM。请注意,您的 Elasticsearch 服务器所需的 CPU、RAM 和存储量取决于您期望的日志量。
-
已安装 OpenJDK 11。请参阅安装默认 JRE/JDK 如何在 Ubuntu 20.04 上使用 Apt 安装 Java 部分进行设置。
-
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
指向您服务器的公共 IP 地址的 A 记录。- 指向您服务器的公共 IP 地址的 A 记录。
www.your_domain
步骤 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 侦听来自 port 上任何地方的流量9200
。您需要限制外部访问您的 Elasticsearch 实例,以防止外部人员通过其REST API读取您的数据或关闭您的 Elasticsearch 集群。要限制访问并因此提高安全性,请找到指定 的行network.host
,取消注释并将其值替换为localhost
如下所示:
. . .
# ---------------------------------- 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。
启动 Elasticsearch 服务systemctl
。给 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 教程直到最后,您可能已经创建了此文件并填充了一些内容。在这种情况下,请在添加以下内容之前删除文件中的所有现有内容:
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 教程,您可能已经创建了一个 UFW 规则,允许Nginx HTTP
配置文件通过防火墙。由于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
配置。这指定beats
将侦听 TCP 端口的输入5044
。
input {
beats {
port => 5044
}
}
保存并关闭文件。
接下来,创建一个名为 的配置文件30-elasticsearch-output.conf
:
- sudo nano /etc/logstash/conf.d/30-elasticsearch-output.conf
插入以下output
配置。本质上,此输出将 Logstash 配置为将 Beats 数据存储在运行于 的 Elasticsearch 中,localhost:9200
以使用的 Beat 命名的索引中。本教程中使用的 Beat 是 Filebeat:
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。
安装 Filebeat 使用apt
:
- 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
部分并通过在它们前面加上注释来注释掉以下几行#
:
...
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
...
然后,配置该output.logstash
部分。取消注释行output.logstash:
并hosts: ["localhost:5044"]
删除#
. 这将配置 Filebeat 以连接到您的 Elastic Stack 服务器上5044
的 Logstash 端口,我们之前为该端口指定了 Logstash 输入:
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 配置为使用系统日志和授权日志的默认路径。在本教程的情况下,您不需要更改配置中的任何内容。可以在/etc/filebeat/modules.d/system.yml
配置文件中看到模块的参数 。
接下来,我们需要设置 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 主页:
单击左侧导航栏中的“发现”链接(您可能需要单击左下角的“展开”图标才能查看导航菜单项)。在“发现”页面上,选择预定义的filebeat- * 索引模式以查看 Filebeat 数据。默认情况下,这将显示过去 15 分钟内的所有日志数据。您将看到带有日志事件的直方图,以及下面的一些日志消息:
在这里,您可以搜索和浏览您的日志,还可以自定义您的仪表板。不过,此时不会有太多内容,因为您只是从 Elastic Stack 服务器收集系统日志。
使用左侧面板导航到仪表板页面并搜索Filebeat 系统仪表板。在那里,您可以选择 Filebeatsystem
模块附带的示例仪表板。
例如,您可以根据系统日志消息查看详细统计信息:
您还可以查看哪些用户使用了该sudo
命令以及何时使用:
Kibana 还具有许多其他功能,例如绘图和过滤,因此您可以随意探索。
结论
在本教程中,您学习了如何安装和配置 Elastic Stack 以收集和分析系统日志。请记住,您可以使用Beats将几乎任何类型的日志或索引数据发送到 Logstash ,但如果使用 Logstash 过滤器对数据进行解析和结构化,数据将变得更加有用,因为这会将数据转换为可以读取的一致格式通过 Elasticsearch 轻松实现。