工程

如何使用 Elastic Stack 监测 Nginx Web 服务器

在本文中,我们将介绍如何使用 Elastic Stack 的各种组件来监测 Nginx。我们会使用 Metricbeat 和 Filebeat 来收集数据。这些数据将发送到 Elasticsearch 并存储在其中。最后,我们会使用 Kibana 查看数据。

Metricbeat 将收集与连接相关的数据(活动、已处理、已接受等),以及客户端请求的总数。Filebeat 将收集与访问日志和错误日志相关的数据。收集的信息会因不同的设置而有所变化,但在大多数情况下,我们可以使用这些信息来推断某些事情,例如:

  • 如果针对某个资源的错误日志数出现陡增,则可能意味着我们删除了一个仍在需要的资源。
  • 访问日志就可以了解一项服务出现峰值的时间(从而可以确定执行维护之类操作的最佳时间)。
  • 如果客户端请求数突然出现陡增,则表明可能有恶意攻击(如 DDOS 攻击)。

本文的重点是介绍监测功能,因此,像 ElasticSearch 设置这样的内容将简单带过。我使用的是 Mac 系统,所以将会使用 Elasticsearch、Metricbeat、Filebeat 和 Kibana 的 Mac 发行版。有关其他平台的发行版,可以从下载页面获取

安装 Elasticsearch

MetricbeatFilebeat(实际上是所有 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,应会看到以下欢迎内容:

“Welcome to Kibana”(欢迎使用 Kibana)屏幕

您可以选择尝试操作样本数据,但在这里我们将单击 Explore on my own(浏览我自己的数据)。

在 Kibana 中可视化 Nginx 数据

接下来,我们将介绍如何使用 Kibana 查看和分析数据。

基础架构

如果我们导航到 Kibana 侧栏上的“Infrastructure”(基础架构)应用,将能够看到基础架构(最后一刻)的快照视图。根据所使用的配置,可以在“Hosts”(主机)下访问基于非自动发现的设置的数据,对于自动发现的设置,Docker 和 Kubernetes 按钮(基于所使用的提供程序)将引导您访问正确的数据集:

Hosts(主机)、Kubernetes 和 Docker 按钮

因为我使用的是基于主机的设置,所以我可以单击“Hosts”(主机)按钮,查看正在从 Metricbeat 发送的下列数据:

单击“Hosts”(主机)按钮可查看正在发送的数据

如果我们选择其中一个节点,并选择查看指标,则可以看到一个针对该单一 Nginx 服务器的详细指标页面。

显示服务器指标的 Kibana 图表

日志

如果导航到“Logs”(日志)应用,我们将能够看到从 Filebeat 发送来的访问日志和错误日志。

显示错误日志和访问日志的 Kibana Logs 应用

预配置的 Nginx 仪表板

至此,我们已经有了 Kibana 的正在运行和可访问的实例,我们接下来可以加载一些预制的仪表板。

要加载 Metricbeat 仪表板,请在 Metricbeat 目录中运行以下命令:

sudo ./metricbeat setup --dashboards

对 Filebeat 执行相同命令:

sudo ./filebeat setup --dashboards

现在,如果我们导航到 Kibana 中的“Dashboards”(仪表板)选项卡,应看到以下内容:

显示可用仪表板的 Kibana 页面

如果将范围缩小到“nginx”搜索,我们将看到以下可用的仪表板:

显示可用 Nginx 仪表板的 Kibana 页面

例如,[Filebeat Nginx] 访问日志和错误日志 ECS 仪表板将类似如下所示:

Filebeat Nginx 访问日志和错误日志 ECS

至此,我们已经学习了如何使用 Elastic Stack 来监测 Nginx 服务器。其中可以使用各种选项(例如,不同的分组和筛选选项)来深入了解对您真正重要的信息。

亲自试用

Elastic Stack 入门非常简单 — 您可以通过提供的 curl 命令下载各种产品,也可以浏览我们的下载页面,从中获取产品。甚至更为简单的是,可以先注册获得 Elasticsearch 服务的 14 天免费试用,然后再获取产品。如果遇到任何问题,可以访问讨论论坛来了解更多信息。