如何使用 Elastic Stack 监测 Nginx Web 服务器
在本文中,我们将介绍如何使用 Elastic Stack 的各种组件来监测 Nginx。我们会使用 Metricbeat 和 Filebeat 来收集数据。这些数据将发送到 Elasticsearch 并存储在其中。最后,我们会使用 Kibana 查看数据。
Metricbeat 将收集与连接相关的数据(活动、已处理、已接受等),以及客户端请求的总数。Filebeat 将收集与访问日志和错误日志相关的数据。收集的信息会因不同的设置而有所变化,但在大多数情况下,我们可以使用这些信息来推断某些事情,例如:
- 如果针对某个资源的错误日志数出现陡增,则可能意味着我们删除了一个仍在需要的资源。
- 访问日志就可以了解一项服务出现峰值的时间(从而可以确定执行维护之类操作的最佳时间)。
- 如果客户端请求数突然出现陡增,则表明可能有恶意攻击(如 DDOS 攻击)。
本文的重点是介绍监测功能,因此,像 ElasticSearch 设置这样的内容将简单带过。我使用的是 Mac 系统,所以将会使用 Elasticsearch、Metricbeat、Filebeat 和 Kibana 的 Mac 发行版。有关其他平台的发行版,可以从下载页面获取。
安装 Elasticsearch
Metricbeat 和 Filebeat(实际上是所有 Beats)都需要 Elasticsearch 集群来存储数据。我们将在本地设置一个简单的 Elasticsearch 集群。由于我们未对外公开 Elasticsearch,所以我们无需花费时间配置安全性。
第 1 步:下载 Elasticsearch
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-darwin-x86_64.tar.gz
第 2 步:解压缩存档文件
tar -xvf elasticsearch-7.1.0-darwin-x86_64.tar.gz
第 3 步:更改为 bin 目录
cd elasticsearch-7.1.0/bin
第 4 步:启动我们的单一节点集群
./elasticsearch
默认情况下,您的集群将在 localhost:9200
运行。
运行 Nginx
有许多途径可以运行 Nginx — 在主机上独立运行、通过 Docker 容器运行,或者在 Kubernetes 设置中运行等等。Beats 具有自动发现功能,可在服务器容器加速和被删除时侦听容器 API 事件,以跟踪服务器容器。
鉴于 Nginx 可以通过多种方式进行设置和配置,本文将不做过多假设,并会展示主机配置和自动发现(在本用例中是 Docker)示例。
配置 Metricbeat 和 Filebeat
现在,我们将配置 Beats 来开始收集和发送数据。
Metricbeat
我们将使用 Metricbeat 收集指标。
第 1 步:下载 Metricbeat:
curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.1.0-darwin-x86_64.tar.gz
第 2 步:解压缩存档文件
tar -xvf metricbeat-7.1.0-darwin-x86_64.tar.gz
第 3 步:更改目录
cd metricbeat-7.1.0-darwin-x86_64
配置时间!
默认情况下,配置文件 (metricbeat.yml) 将查找在 localhost:9200 运行的 Elasticsearch 集群,这是我们早前配置好的。
第 4 步:启用相关的 Metricbeat 模块
默认情况下,仅收集系统级别的指标:
./metricbeat modules enable nginx
第 5 步:更改文件所有权
我们需要更改几个文件的所有权,因为我们将以根用户身份运行 Metricbeat(或者,您可以选择在命令行中使用 --strict.perms=false 选项来禁用严格的权限检查):
sudo chown root metricbeat.yml sudo chown root modules.d/system.yml sudo chown root modules.d/nginx.yml
第 6 步:启用指标集
如果打开 modules.d/nginx.yml
文件,即可启用 stubstatus
指标集,包括取消注释以下内容:
#metricsets: # - stubstatus
这个指标集从 Nginx ngx_http_stub_status 模块收集数据,因此,请务必配置此 Nginx 模块以便指标集正常工作。
此外,您还可以更改此处监测的主机,默认情况下监测的是 <a href="http://127.0.0.1">http://127.0.0.1</a>
。对于基于主机的设置,这就是我们需要的所有信息。
第 7 步:自动发现设置(备选)
使用自动发现设置时,在三个提供程序(Docker、Kubernetes 和 Jolokia)之间的等效配置将会有所不同。Docker 示例将如下所示,其中我们在 metricbeat.yml
配置文件底部添加了 metricbeat.autodiscover
。
metricbeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx metricsets: ["stubstatus"] hosts: "${data.host}:${data.port}"
使用此配置后,将会匹配使用名称中含 Nginx 的图像的所有 Docker 容器(contains 将执行子字符串匹配,而不是精确匹配),并将使用一个 config 来启用带有子状态指标集的 Nginx 模块。
第 8 步:运行 Metricbeat
很好,现在我们已经配置好了,我们接着可以运行带有标志的 Metricbeat,将日志发送到 stderr 并禁用 syslog/文件输出:
sudo ./metricbeat -e
如果一切正常,您应该看到一些初始输出,然后在 Metricbeat 每次将数据发回集群时看到更多的输出。
Filebeat
我们将使用 Filebeat 收集日志。
第 1 步:下载 Filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.0-darwin-x86_64.tar.gz
第 2 步:解压缩存档文件
tar -xvf filebeat-7.1.0-darwin-x86_64.tar.gz
第 3 步:更改目录
cd filebeat-7.1.0-darwin-x86_64
第 4 步:启用 Nginx 模块
./filebeat modules enable nginx
默认情况下,将收集访问日志和错误日志。至于日志文件路径,Filebeat 将尝试根据您的操作系统来确定这些路径,如果您需要显式设置不同的路径,则可以在 modules.d/nginx.yml 配置文件中设置路径。
第 5 步:更改文件所有权
sudo chown root filebeat.yml sudo chown root modules.d/nginx.yml sudo chown root module/nginx/access/manifest.yml sudo chown root module/nginx/error/manifest.yml
对于基于主机的设置,这些就是我们需要的所有信息。
第 6 步:自动发现设置(备选)
如上所述,需要额外配置才能使用自动发现。与前面部分类似,Docker 示例需要将自动发现部分添加到 config 中,filebeat.yml 将类似如下所示:
filebeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx access: input: type: docker containers.ids: - "${data.docker.container.id}" error: input: type: docker containers.ids: - "${data.docker.container.id}"
其中我们会配置访问选项和错误选项,以使用 Docker 输入。Docker 输入将在其路径(Docker 日志所在的基本路径,默认情况下为 /var/lib/docker/containers)
下搜索容器日志。我们使用与模板条件匹配的容器 ID 指定 containers.ids
。总而言之,日志(默认情况下)将来自 /var/lib/docker/containers/ac29b98ad83ca43bb4c15ae8f0d03aff8c7d57bf5dee9024124374b92b14b0f2/
(ID 会有所不同)。
第 7 步:运行 Filebeat
sudo ./filebeat -e
安装 Kibana
至此,我们有了 Metricbeat 和 Filebeat 来发送关于 Nginx 服务器的数据,接下来我们需要一种途径来查看这些数据,这就要使用 Kibana 了。
第 1 步:下载 Kibana
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.1.0-darwin-x86_64.tar.gz
第 2 步:解压缩存档文件并更改目录
tar -xzf kibana-7.1.0-darwin-x86_64.tar.gz
cd kibana-7.1.0-darwin-x86_64
第 3 步:运行 Kibana
./bin/kibana
默认情况下,Kibana 将使用 Elasticsearch 主机 http://localhost:9200
,并可从 http://localhost:5601
访问 Kibana。
如果您导航到 http://localhost:5601
,应会看到以下欢迎内容:
您可以选择尝试操作样本数据,但在这里我们将单击 Explore on my own(浏览我自己的数据)。
在 Kibana 中可视化 Nginx 数据
接下来,我们将介绍如何使用 Kibana 查看和分析数据。
基础架构
如果我们导航到 Kibana 侧栏上的“Infrastructure”(基础架构)应用,将能够看到基础架构(最后一刻)的快照视图。根据所使用的配置,可以在“Hosts”(主机)下访问基于非自动发现的设置的数据,对于自动发现的设置,Docker 和 Kubernetes 按钮(基于所使用的提供程序)将引导您访问正确的数据集:
因为我使用的是基于主机的设置,所以我可以单击“Hosts”(主机)按钮,查看正在从 Metricbeat 发送的下列数据:
如果我们选择其中一个节点,并选择查看指标,则可以看到一个针对该单一 Nginx 服务器的详细指标页面。
日志
如果导航到“Logs”(日志)应用,我们将能够看到从 Filebeat 发送来的访问日志和错误日志。
预配置的 Nginx 仪表板
至此,我们已经有了 Kibana 的正在运行和可访问的实例,我们接下来可以加载一些预制的仪表板。
要加载 Metricbeat 仪表板,请在 Metricbeat 目录中运行以下命令:
sudo ./metricbeat setup --dashboards
对 Filebeat 执行相同命令:
sudo ./filebeat setup --dashboards
现在,如果我们导航到 Kibana 中的“Dashboards”(仪表板)选项卡,应看到以下内容:
如果将范围缩小到“nginx”搜索,我们将看到以下可用的仪表板:
例如,[Filebeat Nginx] 访问日志和错误日志 ECS 仪表板将类似如下所示:
至此,我们已经学习了如何使用 Elastic Stack 来监测 Nginx 服务器。其中可以使用各种选项(例如,不同的分组和筛选选项)来深入了解对您真正重要的信息。