使用Filebeat和Elasticsearch分析Nginx日志

本文实战记录使用Filebeat、Kibana、Elasticsearch等软件搭建搜集分析Nginx日志的系统。Filebeat主要负责将Nginx日志数据作为数据源输送至Elasticsearch。

作为入门介绍文章,首先说明下几个软件之间的关系:Elasticsearch是基于RESTful风格的分布式全文检索和数据分析引擎;Kibana是对Elasticsearch数据进行可视化展示的Web系统;而Filebeat负责将Nginx日志数据作为数据源输送至Elasticsearch。

本文服务器环境:Ubuntu 20.04,仅配置一个服务器节点。

环境准备:JAVA

需要安装Java Runtime Environment (JRE)和Java Development Kit (JDK)。

sudo apt update
apt install default-jre
java -version

sudo apt install default-jdk
javac -version

参考:How To Install Java with Apt on Ubuntu 20.04

Elasticsearch

安装Elasticsearch

#将Elasticsearch公共GPG密钥导入APT:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

#添加Elastic源(笔者试验时elasticsearch最新是7.xx版本):
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee –a /etc/apt/sources.list.d/elastic-7.x.list

#安装elasticsearch
sudo apt update
sudo apt install elasticsearch

配置Elasticsearch

Elasticsearch的配置文件位于:

sudo vim /etc/elasticsearch/elasticsearch.yml

#重要配置项:
#集群名称,相同网络下相同的集群名的节点为一个集群。
cluster.name

#存放数据的目录
path.data

#主机地址
network.host: localhost

#服务端口号
http.port: 9200

管理Elasticsearch:

#启动/停止/重启
sudo systemctl start/stop/restart elasticsearch.service
#注册开机自启动
sudo systemctl enable elasticsearch.service

验证Elasticsearch服务是否启动

root@easeapi:~# curl -X GET localhost:9200
{
  "name" : "easeapi",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "easeapi-wDpaWmxXHJ8yu7a",
  "version" : {
    "number" : "7.11.2",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "c4ca4238a0b923820dcc509a6f75849b",
    "build_date" : "2021-03-01T08:54:38.141101Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

修改Elasticsearch占用内存大小

在小内存服务器上可以适当调小。Elasticsearch 7.x的配置方式较之前有不同,需要在/etc/elasticsearch/jvm.options.d目录新建以.options为后缀的文件。修改内存用量的配置如下:

vim jvm.options.d/jvm.options
-Xms1g
-Xmx1g

参考:elasticsearch jvm-options

Kibana

上一步已添加源,直接安装即可。因为版本依赖的关系,先安装Elasticsearch再安装Kibana。

sudo apt install kibana

Elasticsearch的配置文件位于:

vim /etc/kibana/kibana.yml

重要配置项:

server.port: 5601
server.host: "localhost"
server.basePath: "/kibana"//保持和nginx的访问目录配置一致
server.rewriteBasePath: true
elasticsearch.hosts: ["http://localhost:9200"]

#配置为中文
i18n.locale: "zh-CN"

管理Kibana

#启动/停止/重新启动
sudo systemctl start/stop/restart kibana
#加入自启动
sudo systemctl enable kibana

Filebeat

Filebeat是轻量级的数据收集处理工具,具有占用资源少的优点。

sudo apt install filebeat
#配置文件
sudo vim /etc/filebeat/filebeat.yml

#主要配置项
setup.kibana:
    host: "localhost:5601"

output.elasticsearch:
    hosts: ["localhost:9200"]

管理Filebeat

#启动/停止/重新启动
sudo systemctl start/stop/restart filebeat
#加入自启动
sudo systemctl enable filebeat
#测试连通性
filebeat test output

Filebeat通过Module进行扩展以支持不同数据格式的文件。Module相关的操作命令:

#查看模块状态
sudo filebeat modules list
#启动指定Module
sudo filebeat modules enable nginx

以Nginx为例,在启动Nginx的Module后,可以看到/etc/filebeat/modules.d目录的文件nginx.yml..disabled变成了nginx.yml。

vim /etc/filebeat/modules.d/nginx.yml

#配置nginx的日志路径。
- module: nginx
    access:
        enabled: true
        var.paths: ["/var/log/nginx/access.log"]

    error:
        enabled: true
        ar.paths: ["/var/log/nginx/error.log"]

配置完成后,使用filebeat setup写入配置,然后启动filebeat即可。

去除冗余字段

Filebeat默认输出的字段有些情况下可能无用,造成内容冗余。可以将冗余字段去除:

sudo vim /etc/filebeat/filebeat.yml

processors:
        #- add_host_metadata:
        #    when.not.contains.tags: forwarded
        #- add_cloud_metadata: ~
        #- add_docker_metadata: ~
        #- add_kubernetes_metadata: ~
  - drop_fields:
          fields: ["agent", "nginx", "log.offset", "fileset", "input"]

根据需要补充需要去除的字段。

最佳实践

启动服务

依次启动三个组件:

sudo service elasticsearch start
sudo service kibana start
sudo service filebeat start

Nginx站点配置kibana访问

以Nginx站点的二级目录作为访问路径为例:

server {
    ...
    location /kibana/ {
            proxy_pass http://127.0.0.1:5601;
            rewrite ^/kibabna/(.*)$ /$1 break;
    }
}

通过https://easeapi.com/kibana 即可访问到kibana。

为kibana配置密码

apt install apache2-utils
htpasswd -c /home/htpasswd <username>

将生成一个基于HTTP Basic Authentication认证的密码文件。在Nginx站点中增加配置:

server {
    auth_basic 'easeapi center';
    auth_basic_user_file /home/htpasswd;
}

当访问对应页面时,会提示输入密码验证。

添加索引

打开kibana页面后,点击「添加数据」,选择「Nginx日志」(会有Filebeat模块解析Nginx日志的操作指南),按指引操作完成。

参考:

How to Install ELK on Ubuntu 20.04

其它文章

使用CDN提升网站访问速度
优化Nginx配置提升网站性能
Let’s Encrypt acme.sh 泛域名证书
utf8mb4:MYSQL中使用Emoji