数据, 术→技巧, 运维

使用ELK监控Nginx日志

钱魏Way · · 212 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

在先前的文章中介绍了使用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 服务。

参考链接:

发表回复

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