数据, 术→技巧, 运维

使用ELK监控Nginx日志

钱魏Way · · 3 次浏览

在先前的文章中介绍了使用Python解析Nginx日志,今天主要介绍的是使用ELK(Elasticsearch + Logstash + Kibana)来监控Nginx日志。

备注:以下方案占用CPU和内存过大,不适合在云服务器部署。

工具简介

本教程涉及Filebeat、Elasticsearch、Logstash、Kibana四个工具。

Filebeat

  • 用途:Filebeat 是 Elastic Stack(以前称为 ELK Stack)的一部分,是一个轻量级日志文件采集器。
  • 功能:它用于监控日志文件或日志目录,收集日志数据,然后发送到 Elasticsearch 或 Logstash 进行进一步处理。
  • 场景:Filebeat 特别适合于收集和转发日志数据,因其轻量级和易于配置的特点。

Elasticsearch

  • 用途:Elasticsearch 是一个高性能的搜索和分析引擎。
  • 功能:它允许用户快速地存储、搜索和分析大量的数据。通常用于日志分析、全文搜索、安全智能、业务分析等领域。
  • 特点:以其快速的搜索能力、水平扩展性和易用性而闻名。

Logstash

  • 用途:Logstash 是 Elastic Stack 的一部分,是一个服务器端数据处理管道。
  • 功能:它可以同时从多个源接收数据,转换这些数据,然后将它们发送到您选择的“存储库”中,如 Elasticsearch。
  • 场景:Logstash 特别适用于日志数据的收集、转换和解析。

Kibana

  • 用途:Kibana 是 Elasticsearch 的数据可视化面板工具。
  • 功能:它提供了基于 Web 的界面,允许用户创建和分享各种复杂的仪表板,这些仪表板可以展示 Elasticsearch 索引中的数据。
  • 特点:Kibana 通常用于数据探索、可视化和仪表板的创建。

安装与配置

由于服务器是Ubuntu 22.04,所以以下教程针对的是的Ubuntu。以下是详细的过程。

安装和配置 Elasticsearch

添加 Elasticsearch GPG 密钥

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

安装 HTTPS 传输

sudo apt-get install apt-transport-https

添加 Elasticsearch 源

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

更新并安装 Elasticsearch

sudo apt-get update && sudo apt-get install elasticsearch

配置 Elasticsearch 在 /etc/elasticsearch/elasticsearch.yml(根据需要修改配置)。

elasticsearch.yml文件提供了集群、节点、路径、内存、网络、发现和网关的配置选项。这些选项中的大多数都在文件中预先配置,但您可以根据需要进行更改。为了演示单个服务器配置,我们将只调整网络主机的设置。

Elasticsearch在9200端口上侦听来自各处的流量。您需要限制外部访问您的Elasticsearch实例,以防止外部人员通过其[REST API]读取您的数据或关闭Elasticsearch集群(https://en.wikipedia.org/wiki/Representational_state_transfer).要限制访问并提高安全性,请找到指定network.host的行,取消注释,然后将其值替换为localhost,如下所示:

sudo nano /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

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

测试是否安装成功

curl -X GET "localhost:9200"
{
  "name" : "VM-12-16-ubuntu",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "4U2r4MnFRWqMbqwSbqyLtg",
  "version" : {
    "number" : "7.17.15",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "0b8ecfb4378335f4689c4223d1f1115f16bef3ba",
    "build_date" : "2023-11-10T22:03:46.987399016Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

安装和配置 Kibana

安装 Kibana

sudo apt-get install kibana

配置 Kibana 在 /etc/kibana/kibana.yml(设置 Elasticsearch URL)。

在终端上打开 /etc/kibana/kibana.yml 文件,此文件包含 Kibana 的所有配置。

sudo nano /etc/kibana/kibana.yml

在文件中查找下面的行,该行可能已经存在:

# elasticsearch.hosts: ["http://localhost:9200"]

删除前面的注释符号 #,然后将 Elasticsearch URL 更改为您的 Elasticsearch 实例的 URL,例如:

elasticsearch.hosts: ["http://localhost:9200"]

确保 URL 包含正确的主机和端口,以便 Kibana 能够连接到您的 Elasticsearch 实例。

保存并退出文件。

启动 Kibana

sudo systemctl start kibana
sudo systemctl enable kibana

配置Kibana可被访问

因为Kibana被配置为只在localhost上侦听,所以我们必须设置一个反向代理以允许外部访问它。首先,使用openssl命令创建一个管理Kibana用户,用于访问Kibana web界面。例如,我们将此帐户命名为kibanaadmin,但为了确保更高的安全性,我们建议您为用户选择一个难以猜测的非标准名称。

以下命令将创建管理Kibana用户和密码,并将它们存储在htpasswd.users文件中。

echo "kibanaadmin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users

在提示下输入并确认密码。

接下来配置Nginx服务器。新建一个文件类似:sudo nano /etc/nginx/sites-enabled/kibana.biaodianfu.com

内容如下:

server {
    listen 80;

    server_name kibana.biaodianfu.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:

sudo nginx -t
sudo systemctl reload nginx

访问http://kibana.biaodianfu.com/status 查看kibana的运行状态。

安装和配置 Filebeat

安装 FileBeat

sudo apt-get install filebeat

启用 Nginx 模块

FileBeat 提供了多种模块来简化日志文件的收集和解析,包括一个用于 Nginx 日志的模块。

sudo filebeat modules enable nginx

配置 FileBeat

编辑 FileBeat 配置文件:

打开 /etc/filebeat/filebeat.yml,配置 FileBeat 以将日志数据发送到 Logstash。

output.logstash:
  hosts: ["localhost:5044"]

设置 Nginx 日志路径

在 /etc/filebeat/modules.d/nginx.yml 中,确保正确设置了 Nginx 日志文件的路径。

sudo nano /etc/filebeat/modules.d/nginx.yml

配置日志路径:在 access 和 error 部分中,确保 var.paths 设置为您的 Nginx 日志文件的实际路径。默认路径通常如下所示:

- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log*"]
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log*"]

如果您的 Nginx 日志文件存储在不同的位置,请相应地修改 var.paths。

测试配置

在应用更改之前,建议使用 FileBeat 测试您的配置文件,以确保没有语法错误。

sudo filebeat test config
sudo filebeat test output

启动 Filebeat

sudo systemctl start filebeat
sudo systemctl enable filebeat

安装和配置 Logstash

安装 Logstash

sudo apt-get install logstash

创建 Logstash 配置文件

配置文件应包括用于解析 Nginx 日志的输入、过滤器和输出部分。

要设置 Logstash 配置文件以包含 Filebeat,您需要创建一个 Logstash 配置文件,该文件定义了从 Filebeat 接收数据的方法。
在 /etc/logstash/conf.d/ 中创建一个配置文件,例如
sudo nano /etc/logstash/conf.d/filebeat-input.conf

input {
  beats {
    port => 5044
  }
}
filter {
  if [fileset][module] == "nginx" {
    if [fileset][name] == "access" {
      grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
      }
      date {
        match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
      }
    }
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
  }
}

启动并测试 Logstash

启动 Logstash 并检查是否有错误。

sudo systemctl start logstash
sudo systemctl enable logstash

重启 FileBeat

重启 FileBeat 以应用更改。

sudo systemctl restart filebeat

完成这些步骤后,FileBeat 应该开始从 Nginx 的 access.log 收集日志,并通过 Logstash 将其发送到 Elasticsearch。确保您的 Elasticsearch 集群已经运行并可以接收数据。

低性能服务器的应对方案

以下是在性能较差的云服务器上运行Elasticsearch、Kibana、Logstash和Filebeat的一些建议:

调整Elasticsearch的jvm.options

Elasticsearch 的 jvm.options 文件通常位于 Elasticsearch 配置目录中。这个目录的具体位置取决于您的安装方式和操作系统,但通常位于以下位置之一:

sudo nano /etc/elasticsearch/jvm.options

在 jvm.options 文件中,您可以设置多个 JVM 参数,其中最常见的是以下两个:

  • -Xms<size>:设置 JVM 的初始堆内存大小。例如,-Xms2g 表示设置初始堆内存为 2GB。
  • -Xmx<size>:设置 JVM 的最大堆内存大小。例如,-Xmx2g 表示设置最大堆内存为 2GB。

通常建议将 -Xms 和 -Xmx 设置为相同的值,以避免堆内存自动扩展。

比如设置:

-Xms256m
-Xmx256m

查看和关闭不必要的Elasticsearch插件

查看当前安装的插件

sudo bin/elasticsearch-plugin list

查看列表中的插件,并了解每个插件的功能。确定是否有插件是当前不需要的或者对系统性能有负面影响。

关闭不必要的插件

sudo bin/elasticsearch-plugin remove [插件名]

将 [插件名] 替换为您想要卸载的插件名称。

完成插件卸载后,需要重启 Elasticsearch 服务以使更改生效。

限制 Kibana 进程的内存使用

可以通过 Node.js 的环境变量来限制 Kibana 进程可以使用的最大内存。

使用以下命令来设置环境变量,限制 Kibana 进程的最大内存使用量。例如,要将内存限制为 256M,请使用:

export NODE_OPTIONS="--max-old-space-size=256"

设置环境变量后,需要重启 Kibana 服务以使更改生效。

调整Firebeat的扫描频率

调整 Filebeat 的扫描频率可以帮助管理其对资源的使用,尤其是在处理大量日志文件的情况下。扫描频率决定了 Filebeat 查看文件变化的频率等。

filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: false
  paths:
    # - /var/log/nginx/*.log
    - /var/log/nginx/*.log
  # prospector.scanner.exclude_files: ['.gz$']
  prospector.scanner.exclude_files: ['.gz$']
scan_frequency: 30s

在这个例子中,scan_frequency 被设置为 30s。您可以根据需要调整这个值,例如改为 60s 或 5m。

对配置文件做出更改后,保存并关闭文件。重启 Filebeat 服务。

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注