一、ELFK 架构与系统要求

1.1 ELFK 组件架构解析

ELFK 是一套完整的开源日志收集和分析解决方案,由四个核心组件组成:

Elasticsearch作为分布式搜索和分析引擎,是整个系统的核心存储组件。它基于 Apache Lucene 构建,能够存储、搜索和分析大量结构化和非结构化数据。Elasticsearch 具有近实时写入能力(默认 1 秒内可被检索),通过倒排索引实现快速查询,并支持分片与副本机制提升吞吐量和可靠性。

Logstash是一个数据处理管道,负责从各种来源收集数据,进行过滤、转换和丰富化处理,然后将处理后的数据发送到 Elasticsearch。它采用输入 - 过滤 - 输出(Input-Filter-Output)三层架构,支持插件化扩展,能够处理来自文件、网络、消息队列等多种数据源的日志。

Filebeat是轻量级的日志采集器,用 Go 语言开发,资源占用极低(内存小于 50MB)。它通过 prospectors 和 harvesters 两个组件协同工作,实时监控日志文件变化并发送到 Logstash 或 Elasticsearch。相比 Logstash,Filebeat 更适合大规模部署在多个服务器上进行分布式日志采集。

Kibana提供 Web 界面用于可视化和分析存储在 Elasticsearch 中的数据。它通过索引模式与 Elasticsearch 建立连接,支持创建各种可视化图表、仪表盘和搜索查询,为用户提供直观的日志分析和监控功能。

1.2 系统环境要求

在 Ubuntu 24.04 上部署 ELFK 系统,需要满足以下硬件和软件要求:

硬件要求:

  • CPU:Elasticsearch 节点建议 2-4 核,生产环境推荐 4 核以上

  • 内存:Elasticsearch 最低 4GB,推荐 8GB;Logstash 最低 4GB;Kibana 最低 2GB;Filebeat 最低 1GB

  • 存储:SSD 强烈推荐,最低 20GB 可用空间,根据数据量和保留期调整

  • 网络:需要开放 9200(Elasticsearch HTTP)、9300(Elasticsearch 集群通信)、5601(Kibana)、5044(Logstash Beats 输入)等端口

软件要求:

  • 操作系统:Ubuntu 24.04 LTS(64 位)

  • Java 运行环境:Elasticsearch 8.x 内置 OpenJDK 17,无需额外安装

  • 系统内核:Ubuntu 24.04 默认内核 6.8 已支持 Intel 13 代和 14 代处理器

1.3 部署架构说明

本指南采用单节点部署架构,所有 ELFK 组件运行在同一台服务器上。这种架构适合测试环境或小规模生产环境。在生产环境中,建议采用集群架构以提高可用性和性能。

部署流程将按照以下顺序进行:

  1. 系统环境准备(更新系统、安装依赖、配置内核参数)

  2. 安装 Elasticsearch(核心存储组件)

  3. 安装 Kibana(可视化界面)

  4. 安装 Logstash(数据处理管道)

  5. 安装 Filebeat(日志采集器)

  6. 配置各组件并启动服务

  7. 验证系统功能

  8. 测试日志采集流程

二、系统环境准备

2.1 系统更新与依赖安装

首先登录到 Ubuntu 24.04 服务器,执行系统更新和基础依赖包安装:

# 更新系统包索引
sudo apt update

# 升级系统已安装的软件包(建议执行,确保系统环境最新)
sudo apt upgrade -y

# 安装必要的系统工具和依赖
sudo apt install -y apt-transport-https curl wget gnupg2

2.2 配置系统内核参数

Elasticsearch 对系统内核参数有特定要求,特别是虚拟内存映射参数vm.max_map_count。Ubuntu 24.04 默认该参数值为 1048576,已满足要求,但建议确认并配置其他必要参数:

# 查看当前vm.max_map_count值
cat /proc/sys/vm/max_map_count

# 如果输出不是262144或更高,执行以下命令(Ubuntu 24.04通常不需要)
# sudo sysctl -w vm.max_map_count=262144

# 配置系统资源限制(针对elasticsearch用户)
sudo tee -a /etc/security/limits.conf <<EOF
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
EOF

# 配置sysctl参数(如果需要)
sudo tee -a /etc/sysctl.conf <<EOF
vm.max_map_count=262144
fs.file-max=65536
EOF

# 使配置生效
sudo sysctl -p

2.3 防火墙配置

为了确保 ELFK 各组件之间能够正常通信,需要配置防火墙规则。在测试环境中,您可以选择关闭防火墙或开放必要端口:

# 查看当前防火墙状态
sudo ufw status

# 方案一:测试环境(关闭防火墙)
sudo ufw disable

# 方案二:生产环境(开放必要端口)
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 9200/tcp   # Elasticsearch HTTP
sudo ufw allow 9300/tcp   # Elasticsearch 集群通信
sudo ufw allow 5601/tcp   # Kibana
sudo ufw allow 5044/tcp   # Logstash Beats输入
sudo ufw allow 80/tcp     # HTTP(可选)
sudo ufw allow 443/tcp    # HTTPS(可选)

# 启用防火墙
sudo ufw enable

# 验证防火墙规则
sudo ufw status numbered

三、安装 Elasticsearch

3.1 添加 Elasticsearch 软件源

Elasticsearch 的安装需要使用官方软件源,执行以下命令添加:

# 下载并导入Elasticsearch官方GPG密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

# 添加阿里云 Elastic 镜像源(8.x版本)
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://mirrors.aliyun.com/elasticstack/8.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/elastic.list

# 更新包索引
sudo apt update

3.2 安装 Elasticsearch

执行安装命令,并设置开机自启:

# 安装Elasticsearch
sudo apt install -y elasticsearch

# 设置开机自启
sudo systemctl enable elasticsearch

# 启动Elasticsearch服务
sudo systemctl start elasticsearch

# 查看服务状态(验证是否启动成功)
sudo systemctl status elasticsearch

服务启动后,您应该看到类似以下输出,表示服务正在运行:

● elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-10-16 10:00:00 CST; 1min ago
   Main PID: 1234 (java)
      Tasks: 50 (limit: 4915)
     Memory: 2.1G
        CPU: 30s
     CGroup: /system.slice/elasticsearch.service
             └─1234 /usr/bin/java -Xms1g -Xmx1g ...

3.3 配置 Elasticsearch

Elasticsearch 的主要配置文件位于/etc/elasticsearch/elasticsearch.yml。使用文本编辑器打开该文件:

sudo vim /etc/elasticsearch/elasticsearch.yml

配置文件的详细参数说明如下:

# 集群配置
cluster.name: elfk-cluster  # 集群名称,所有节点必须一致
node.name: node-1           # 节点名称,单节点部署时使用

# 数据路径配置
path.data: /var/lib/elasticsearch  # 数据存储路径
path.logs: /var/log/elasticsearch  # 日志文件路径

# 网络配置
network.host: 0.0.0.0      # 绑定所有网络接口,允许外部访问
http.port: 9200            # HTTP端口
transport.port: 9300       # 集群通信端口

# 单节点配置(重要!)
discovery.type: single-node  # 设置为单节点模式,避免集群发现问题

# 内存锁定(可选,生产环境建议启用)
# bootstrap.memory_lock: true

# 安全配置(Elasticsearch 8.x默认启用)
# -------------------- 安全与 SSL --------------------
xpack.security.enabled: true
#关闭enrollment功能,因为我们不使用内置证书
xpack.security.enrollment.enabled: false

# ---- HTTP 层(9200)----
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.certificate:       /etc/elasticsearch/certs/es-node1.crt
xpack.security.http.ssl.key:               /etc/elasticsearch/certs/es-node1.key
xpack.security.http.ssl.certificate_authorities: ["/etc/elasticsearch/certs/ca.crt"]

# ---- 传输层(9300)----
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.certificate:       /etc/elasticsearch/certs/es-node1.crt
xpack.security.transport.ssl.key:               /etc/elasticsearch/certs/es-node1.key
xpack.security.transport.ssl.certificate_authorities: ["/etc/elasticsearch/certs/ca.crt"]

# 跨域配置(允许Kibana访问)
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length

配置完成后,保存并退出编辑器。接下来需要配置 Elasticsearch 的内存使用。编辑 JVM 选项文件:

sudo vim /etc/elasticsearch/jvm.options.d/heap.options

根据服务器内存配置 JVM 堆大小(建议设置为物理内存的 50%,最大不超过 31GB):

-Xms4g  # 初始堆大小
-Xmx4g  # 最大堆大小

3.4 初始化安全配置

Elasticsearch 8.x 默认启用了安全认证,需要初始化内置用户密码:

# 初始化内置用户密码(包括elastic、kibana_system、logstash_system等)
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

执行该命令后,系统会提示您为每个内置用户设置密码。建议为elastic用户设置一个强密码(例如:Elastic@1234),并记录下来供后续使用。

忘记密码解决方案:
方案:如果你不记得想重置 elastic 用户密码

你应该使用 elasticsearch-reset-password 工具。

  1. 停止 Elasticsearch 服务

    sudo systemctl stop elasticsearch
    
  2. 使用 elasticsearch-reset-password 命令重置密码

    这个命令需要在 Elasticsearch 的安装目录下执行,并且需要

    elasticsearch用户权限。
    
    # 切换到 elasticsearch 用户
    sudo su - elasticsearch -s /bin/bash
    
    # 执行重置命令,为 'elastic' 用户生成一个新的随机密码
    /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
    
  3. 记录新密码

    命令执行成功后,会在控制台输出新生成的密码。

    请务必立即复制并妥善保存这个密码,它只会显示这一次。

    ...
    Successfully reset password for user [elastic]
    New password: <这里会显示一个随机生成的新密码>
    
  4. 退出 elasticsearch 用户并重启服务

    exit
    sudo systemctl start elasticsearch
    
  5. 验证新密码

    使用新密码通过curl进行验证。

    curl -u elastic:<新生成的密码> -k https://10.168.2.241:9200/_cluster/health?pretty
    

    如果返回集群健康状态信息,说明密码重置成功。

3.5 验证 Elasticsearch 安装

使用curl命令验证 Elasticsearch 是否正常运行:

# 验证Elasticsearch(需要提供elastic用户的密码)
curl -u elastic:Elastic@1234 -k https://localhost:9200

# 查看集群健康状态
curl -u elastic:Elastic@1234 -k https://localhost:9200/_cluster/health?pretty

# 查看节点信息
curl -u elastic:Elastic@1234 -k https://localhost:9200/_cat/nodes?v

如果看到类似以下的 JSON 输出,说明 Elasticsearch 安装成功:

{
  "name" : "node-1",
  "cluster_name" : "elfk-cluster",
  "cluster_uuid" : "xxx",
  "version" : {
    "number" : "8.15.0",
    ...
  },
  "tagline" : "You Know, for Search"
}

3.6、ELFK 配置使用自定义生成OpenSSL的 自签证书


✅ 1. 证书规划(单节点也要规划好,方便以后扩)

组件证书用途文件命名
CA根证书ca.crt + ca.key
Elasticsearch服务端/客户端一体es-node1.crt + es-node1.key
Kibana作为客户端连接 ES只需 CA 证书
Logstash作为客户端输出 ES只需 CA 证书
Filebeat作为客户端输出 Logstash本例走 HTTP 没开 TLS,如需开也一样

✅ 2. 生成证书(一步到位)

# 2.1 建目录
sudo mkdir -p /etc/elasticsearch/certs /etc/kibana/certs /etc/logstash/certs
sudo chown -R elastic:elastic /etc/elasticsearch/certs
sudo chown -R elastic:elastic /etc/kibana/certs
sudo chown -R elastic:elastic /etc/logstash/certs

# 2.2 进入工作目录
cd /etc/elasticsearch/certs

# 2.3 生成私有 CA
sudo openssl genrsa -out ca.key 4096
sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=ELFK-CA"

# 2.4 生成节点私钥 & CSR(注意 CN 填主机名)
sudo openssl genrsa -out es-node1.key 4096
sudo openssl req -new -key es-node1.key -out es-node1.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=es-node1"

# 2.5 写 SAN 扩展文件(单节点也要写,防浏览器报警)
cat <<EOF | sudo tee es-node1.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = es-node1
IP.1  = 127.0.0.1
IP.2  = $(hostname -I | awk '{print $1}')   # 自动读本机内网 IP
EOF

# 2.6 签发正式证书
sudo openssl x509 -req -in es-node1.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out es-node1.crt -days 1095 -sha256 -extfile es-node1.ext

# 2.7 权限收紧
sudo chmod 600 *.key
sudo chown -R elastic:elastic /etc/elasticsearch/certs

✅ 3. Elasticsearch 配置(/etc/elasticsearch/elasticsearch.yml

# ======================== Elasticsearch Configuration =========================
cluster.name: elfk
node.name: es-node1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------

# -------------------- 安全与 SSL --------------------
xpack.security.enabled: true
#关闭enrollment功能,因为我们不使用内置证书
xpack.security.enrollment.enabled: false
# ---- HTTP 层(9200)----
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.certificate:       /etc/elasticsearch/certs/es-node1.crt
xpack.security.http.ssl.key:               /etc/elasticsearch/certs/es-node1.key
xpack.security.http.ssl.certificate_authorities: ["/etc/elasticsearch/certs/ca.crt"]
# ---- 传输层(9300)----
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.certificate:       /etc/elasticsearch/certs/es-node1.crt
xpack.security.transport.ssl.key:               /etc/elasticsearch/certs/es-node1.key
xpack.security.transport.ssl.certificate_authorities: ["/etc/elasticsearch/certs/ca.crt"]
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------

sudo systemctl restart elasticsearch
curl -u elastic \
  --cacert /etc/elasticsearch/certs/ca.crt \
  https://localhost:9200

能返回集群信息即 OK。

root@rgzn-H610M-K-DDR4:/etc/elasticsearch/certs# curl -u elastic \
>   --cacert /etc/elasticsearch/certs/ca.crt \
>   https://localhost:9200
Enter host password for user 'elastic':
{
  "name" : "es-node1",
  "cluster_name" : "elfk",
  "cluster_uuid" : "tkWxAeZNQH60K1XKd2vm8A",
  "version" : {
    "number" : "8.19.7",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "198d86868932741b4e0d184425510217febc27d1",
    "build_date" : "2025-11-07T13:35:54.762042224Z",
    "build_snapshot" : false,
    "lucene_version" : "9.12.2",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

四、安装 Kibana

4.1 安装 Kibana

Kibana 是 ELFK 系统的可视化界面,需要与 Elasticsearch 版本保持一致:

# 安装Kibana
sudo apt install -y kibana

# 设置开机自启
sudo systemctl enable kibana

# 启动Kibana服务
sudo systemctl start kibana

# 查看服务状态
sudo systemctl status kibana

4.2 配置 Kibana

复制 CA 证书:

sudo cp /etc/elasticsearch/certs/ca.crt /etc/kibana/certs/
sudo chown elastic:elastic /etc/kibana/certs/ca.crt
sudo systemctl restart kibana

生成 token

sudo -u elasticsearch \
/usr/share/elasticsearch/bin/elasticsearch-service-tokens create elastic/kibana default

目录归属全交给 elasticsearch:

sudo chown -R elasticsearch:elasticsearch /etc/elasticsearch

把证书做成“属主 root、组 elasticsearch、640”

sudo chown root:elasticsearch /etc/elasticsearch/certs/http_ca.crt
sudo chmod 640 /etc/elasticsearch/certs/http_ca.crt

把系统用户 kibana 加入 elasticsearch

sudo usermod -aG elasticsearch kibana

Kibana 的配置文件位于/etc/kibana/kibana.yml。使用文本编辑器打开:

sudo vim /etc/kibana/kibana.yml

配置文件的详细参数说明如下:

# 服务器配置
server.port: 5601  # Kibana端口
server.host: "0.0.0.0"  # 绑定所有网络接口,允许外部访问
server.name: "kibana-server-241"  # 服务器名称
# server.basePath: ""  # 如果需要反向代理,设置基础路径

# Elasticsearch连接配置
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.serviceAccountToken: "AAEAAWVsYXN0aWMva2liYW5hL2RlZmF1bHQ6X1B6cDBfSDBRQUduUnhwLS0yaTJkQQ"
elasticsearch.ssl.certificateAuthorities: [ "/etc/elasticsearch/certs/http_ca.crt" ]
elasticsearch.ssl.verificationMode: "none" # 测试环境可禁用证书验证
logging:
  appenders:
    file:
      type: file
      fileName: /var/log/kibana/kibana.log
      layout:
        type: json
  root:
    appenders:
      - default
      - file
pid.file: /run/kibana/kibana.pid
i18n.locale: "zh-CN"

配置完成后保存并退出。需要注意的是,Kibana 默认使用 HTTPS 连接 Elasticsearch,因此需要配置正确的证书路径或禁用证书验证(测试环境)。

4.3 验证 Kibana 访问

在浏览器中访问 Kibana 界面:

https://服务器IP:5601

使用之前设置的elastic用户和密码登录。如果看到 Kibana 的欢迎界面,说明安装成功。首次登录时,Kibana 会引导您进行一些初始配置,包括创建索引模式等。

五、安装 Logstash

5.1 安装 Logstash

Logstash 是数据处理管道,负责接收、处理和转发日志数据:

# 安装Logstash
sudo apt install -y logstash

# 设置开机自启
sudo systemctl enable logstash

# 启动Logstash服务
sudo systemctl start logstash

# 查看服务状态
sudo systemctl status logstash

把 CA 证书拷给 Logstash(只读即可)

sudo mkdir /etc/logstash/certs
sudo cp /etc/elasticsearch/certs/ca.crt /etc/logstash/certs/
sudo chown logstash:logstash /etc/logstash/certs/ca.crt
sudo chmod 644 /etc/logstash/certs/ca.crt

启服务 & 开机自启

sudo systemctl daemon-reload
sudo systemctl enable --now logstash

查看日志 / 排错

# 服务状态
sudo systemctl status logstash

# 实时日志
sudo journalctl -u logstash -f

# 管道加载错误看这里
sudo tail -f /var/log/logstash/logstash-plain.log

5.2 配置 Logstash

Logstash 的配置文件位于/etc/logstash/conf.d/目录下。创建一个新的配置文件:

sudo vim /etc/logstash/conf.d/nginx-beats.conf

配置文件采用 Logstash 配置语言,包含输入、过滤和输出三个主要部分:

input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/logstash/certs/es-node1.crt"
    ssl_key => "/etc/logstash/certs/es-node1.key"
    ssl_certificate_authorities => ["/etc/logstash/certs/ca.crt"]
    ssl_client_authentication => "optional"   # ← 改为 optional 或 required
  }
}

filter {	
  # 解析 Nginx 默认 combined 日志
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  # 把 timestamp 字段转成 @timestamp
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
  # 去掉无用字段
  mutate {
    remove_field => [ "timestamp", "agent", "ecs" ]
  }
}

output {
  elasticsearch {
    hosts => ["https://localhost:9200"]
    user  => "elastic"
    password => "123456"
    ssl => true
    cacert => "/etc/logstash/certs/ca.crt"
    index => "nginx-access-%{+YYYY.MM.dd}"
  }
  # 调试用,可删
  stdout { codec => rubydebug }
}

配置文件的详细说明:

  • 输入(Input):使用beats插件监听 5044 端口,接收 Filebeat 发送的日志数据

  • 过滤(Filter):使用grok插件解析 syslog 格式日志,使用json插件解析 JSON 格式日志

  • 输出(Output):将处理后的日志发送到 Elasticsearch,按日期创建索引

5.3 验证 Logstash 配置

在启动 Logstash 之前,需要验证配置文件的语法正确性:

# 验证Logstash配置文件语法
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t

# 如果看到"Configuration OK",说明配置文件语法正确

六、安装 Filebeat

6.1 安装 Filebeat

Filebeat 是轻量级的日志采集器,负责监控和收集日志文件:

# 安装Filebeat
sudo apt install -y filebeat

# 设置开机自启
sudo systemctl enable filebeat

# 启动Filebeat服务
sudo systemctl start filebeat

# 查看服务状态
sudo systemctl status filebeat
开启Filebeat<=>Logstash双向 TLS(保留 CA+)
  1. 给 Filebeat 生成客户端证书(同一 CA 签发)

    cd /etc/elasticsearch/certs
    sudo openssl genrsa -out filebeat-client.key 4096
    sudo openssl req -new -key filebeat-client.key -out filebeat-client.csr -subj "/CN=filebeat"
    sudo openssl x509 -req -in filebeat-client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
      -out filebeat-client.crt -days 1095 -sha256
    
  2. 拷到 Filebeat 侧

    sudo cp ca.crt filebeat-client.crt filebeat-client.key /etc/filebeat/certs/
    sudo chown root:root /etc/filebeat/certs/*
    sudo chmod 600 /etc/filebeat/certs/*.key
    
  3. Logstash 端改验证模式

    input {
      beats {
        port => 5044
        ssl => true
        ssl_certificate => "/etc/logstash/certs/es-node1.crt"
        ssl_key => "/etc/logstash/certs/es-node1.key"
        ssl_certificate_authorities => ["/etc/logstash/certs/ca.crt"]
        ssl_client_authentication => "optional"   # ← 改为 optional 或 required
      }
    }
    
  4. Filebeat 端加客户端证书

    output.logstash:
      hosts: ["localhost:5044"]
      ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
      ssl.certificate: "/etc/filebeat/certs/filebeat-client.crt"
      ssl.key: "/etc/filebeat/certs/filebeat-client.key"
    

✅ 验证

sudo systemctl restart logstash
ss -lntp | grep 5044
sudo filebeat test output

出现 Logstash: OK 即可。


root@rgzn-H610M-K-DDR4:/etc/logstash/conf.d# filebeat test output
logstash: localhost:5044...
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 127.0.0.1
    dial up... OK
  TLS...
    security: server's certificate chain verification is enabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK

✅ 一句话总结

Logstash 8.x beats-input 源码强制
写 ssl_certificate_authorities 就必须 ssl_client_authentication => “optional”|“required”
写 “none” 会直接抛 ConfigError
要么删掉 ssl_certificate_authorities 做单向 TLS
要么改 “optional” 并给 Filebeat 发客户端证书——5044 就能正常启动

6.2 配置 Filebeat

Filebeat 的配置文件位于/etc/filebeat/filebeat.yml。使用文本编辑器打开:

sudo vim /etc/filebeat/filebeat.yml

配置文件的详细参数说明如下:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    log_type: nginx_access
  fields_under_root: true

# 关键:改送 Logstash
output.logstash:
  hosts: ["localhost:5044"]
  ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
  ssl.certificate: "/etc/filebeat/certs/filebeat-client.crt"
  ssl.key: "/etc/filebeat/certs/filebeat-client.key"
# 可选:加载仪表盘(一次性)
setup.kibana:
  host: "https://localhost:5601"
  ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
  username: "elastic"
  password: "123456"

logging.level: info          # 可选 debug, warning, error
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644

6.3 启用和配置 Filebeat 模块

Filebeat 提供了一些预配置的模块,可以快速启用对常见服务的日志采集:

# 查看可用的模块
sudo filebeat modules list

# 启用system模块(采集系统日志)
sudo filebeat modules enable system

# 配置system模块(可选)
sudo nano /etc/filebeat/modules.d/system.yml

在system.yml文件中,可以配置需要采集的系统日志类型:

- module: system
  syslog:
    enabled: true
    paths:
      - /var/log/syslog
  auth:
    enabled: true
    paths:
      - /var/log/auth.log

七、启动和验证所有服务

7.1 启动所有服务

在完成所有组件的安装和配置后,需要启动所有服务并验证其运行状态:

# 重启所有ELFK服务
sudo systemctl restart elasticsearch
sudo systemctl restart kibana
sudo systemctl restart logstash
sudo systemctl restart filebeat

# 查看所有服务状态
sudo systemctl status elasticsearch
sudo systemctl status kibana
sudo systemctl status logstash
sudo systemctl status filebeat

确保所有服务都显示为active (running)状态。如果有任何服务启动失败,可以通过查看相应的日志文件来排查问题。

7.2 验证 Elasticsearch 索引

使用curl命令查看 Elasticsearch 中是否有日志索引:

# 查看所有索引(需要提供elastic用户密码)
curl -u elastic:123456 -k https://localhost:9200/_cat/indices?v

# 查看特定索引的详细信息
curl -u elastic:123456  -k https://localhost:9200/nginx_access-*/_settings?pretty

如果看到类似nginx_access-2025.11.26的索引,说明日志已经被成功写入。

7.3 验证 Kibana 功能

在浏览器中访问 Kibana 界面(https://服务器IP:5601),使用elastic用户登录后,需要创建索引模式才能查看日志:

  • 点击左侧菜单中的 “管理”(齿轮图标)

  • 选择 “堆栈管理"→"索引模式(没有索引模式的话点数据视图)”

  • 点击 “创建索引模式/数据视图”

  • 输入索引模式名称:nginx_access-*(匹配所有以 nginx_access- 开头的索引)

  • 选择时间字段:@timestamp

  • 点击 “创建索引模式”

创建索引模式后,就可以在 “发现” 页面查看日志数据了。
在这里插入图片描述
在这里插入图片描述

7.4 测试日志采集功能

为了验证整个日志采集流程是否正常工作,可以手动生成一些测试日志:

# 使用logger命令生成系统日志
logger "This is a test log message from ELFK deployment"

# 生成JSON格式的测试日志
echo '{"timestamp":"2024-10-16T12:30:00","level":"INFO","message":"Application started","user_id":"12345","request_id":"abcdef"}' > /tmp/test.log

# 让Filebeat采集这个文件(需要在配置中添加相应的路径)
echo "Test log line 1" >> /var/log/application/app.log
echo "Test log line 2" >> /var/log/application/app.log

等待几分钟后,在 Kibana 的 “发现” 页面应该能看到这些测试日志。

八、系统使用指南

8.1 Kibana 基本操作

Kibana 提供了强大的日志查询和可视化功能。以下是基本的使用步骤:

查询日志:

  • 在 Kibana 主页点击 “发现”

  • 选择之前创建的索引模式(nginx_access-*)

  • 在搜索框中输入查询条件,例如:log_source: “ubuntu-server”

  • 使用时间选择器选择查看日志的时间范围

  • 点击搜索按钮查看结果

创建可视化图表:

  • 点击左侧菜单 “可视化”

  • 选择图表类型(如柱状图、折线图等)

  • 选择数据源(索引模式)

  • 配置聚合方式(如按时间聚合、按字段分组等)

  • 保存并命名可视化图表
    在这里插入图片描述

创建仪表盘:

  • 点击左侧菜单 “仪表盘”

  • 点击 “添加” 按钮选择要添加的可视化图表

  • 调整图表位置和大小

  • 保存仪表盘

8.2 Logstash 配置优化

在生产环境中,可能需要对 Logstash 的性能进行优化。以下是一些关键配置参数:

# /etc/logstash/logstash.yml
pipeline:
  workers: 4  # 工作线程数,建议设置为CPU核心数
  batch:
    size: 125  # 每个批次处理的事件数
    delay: 5    # 等待时间(毫秒)

# /etc/logstash/jvm.options
-Xms2g  # Logstash JVM初始堆大小
-Xmx2g  # Logstash JVM最大堆大小

8.3 Filebeat 性能调优

Filebeat 的性能优化主要包括以下几个方面:

# /etc/filebeat/filebeat.yml
filebeat:
  prospectors:
    - paths:
        - /var/log/*.log
      scan_frequency: 10s  # 扫描频率
      backoff: 1s  # 重试间隔
      max_backoff: 10s  # 最大重试间隔

  # 输出配置优化
  output:
    logstash:
      workers: 2  # 输出工作线程数
      bulk_max_size: 1000  # 批量发送大小

8.4 索引管理策略

为了管理日志数据的存储和生命周期,建议配置索引生命周期管理(ILM):

# 创建ILM策略(示例)
curl -u elastic:Elastic@1234 -k -X PUT "https://localhost:9200/_ilm/policy/logs-policy" -H 'Content-Type: application/json' -d'
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "50GB",
            "max_age": "30d"
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
'

# 将ILM策略应用到索引模板
curl -u elastic:Elastic@1234 -k -X PUT "https://localhost:9200/_template/logs-template" -H 'Content-Type: application/json' -d'
{
  "index_patterns": ["logs-*"],
  "settings": {
    "index.lifecycle.name": "logs-policy",
    "index.lifecycle.rollover_alias": "logs"
  }
}
'

九、常见问题排查

9.1 服务启动失败

如果某个服务无法正常启动,可以通过以下步骤排查:

查看服务日志:

# 查看Elasticsearch日志
sudo journalctl -u elasticsearch -f

# 查看Kibana日志
sudo journalctl -u kibana -f

# 查看Logstash日志
sudo journalctl -u logstash -f

# 查看Filebeat日志
sudo journalctl -u filebeat -f

常见错误及解决方法:

  1. Elasticsearch 启动失败
  • 错误信息:max virtual memory areas vm.max_map_count [65530] is too low

  • 解决方法:执行sudo sysctl -w vm.max_map_count=262144,并将该配置添加到/etc/sysctl.conf

  1. Kibana 无法连接 Elasticsearch
  • 错误信息:Could not contact Elasticsearch at http://localhost:9200

  • 解决方法:检查 Elasticsearch 是否运行、端口是否开放、防火墙设置是否正确

  1. Logstash 配置错误
  • 错误信息:Expected one of #, ", ', }

  • 解决方法:使用–config.test_and_exit选项验证配置文件语法

9.2 日志采集问题

如果日志没有被正确采集或显示,可以按以下步骤排查:

  1. 验证 Filebeat 是否在采集日志
# 查看Filebeat采集状态
sudo filebeat status

# 查看Filebeat采集的文件列表
sudo filebeat list files

# 检查Filebeat注册表(记录已采集的日志位置)
cat /var/lib/filebeat/registry
  1. 验证 Logstash 是否接收到数据
# 在Logstash配置中添加stdout输出,查看是否有数据
output {
  stdout { codec => rubydebug }
}

# 重启Logstash后查看控制台输出
  1. 验证数据是否写入 Elasticsearch
# 查看索引中的文档数量
curl -u elastic:Elastic@1234 -k https://localhost:9200/nginx_access-*/_count?pretty

# 搜索特定文档
curl -u elastic:Elastic@1234 -k -X GET "https://localhost:9200/nginx_access-*/_search?q=message:test&pretty"

9.3 性能问题

如果系统性能不佳,可以考虑以下优化措施:

  1. 增加系统资源
  • 为 Elasticsearch 增加内存(建议至少 8GB)

  • 为 Logstash 增加 CPU 核心

  • 使用 SSD 存储设备

  1. 优化配置参数
  • 调整 Logstash 的pipeline.workers和batch.size

  • 调整 Filebeat 的scan_frequency和bulk_max_size

  • 调整 Elasticsearch 的分片和副本数量

  1. 使用缓存机制
  • 在 Filebeat 和 Logstash 之间使用消息队列(如 Kafka)

  • 配置 Elasticsearch 的缓存策略

  • 使用 Kibana 的缓存功能

十、生产环境最佳实践

10.1 安全加固

在生产环境中,安全是至关重要的。以下是一些安全加固建议:

  1. 启用 HTTPS
  • 为 Elasticsearch 和 Kibana 配置 SSL 证书

  • 使用自签名证书或购买 CA 签名证书

  • 配置证书验证和双向认证

  1. 访问控制
  • 使用防火墙限制访问 IP

  • 配置 Nginx 作为反向代理

  • 启用 Kibana 的身份验证

  • 使用角色权限控制(RBAC)

  1. 数据加密
  • 启用传输层加密(TLS)

  • 配置数据存储加密

  • 定期轮换密钥

10.2 监控与告警

建立完善的监控和告警体系:

  1. 系统监控
  • 使用 Elasticsearch 的监控 API

  • 监控 CPU、内存、磁盘使用情况

  • 监控服务状态和响应时间

  1. 日志告警
  • 在 Kibana 中设置告警规则

  • 基于日志级别(ERROR、CRITICAL)告警

  • 基于日志数量或频率告警

  • 配置邮件或短信告警通知

  1. 性能告警
  • 监控索引写入速度

  • 监控搜索响应时间

  • 监控磁盘空间使用情况

10.3 备份与恢复

制定完善的数据备份和恢复策略:

  1. 定期备份
  • 使用 Elasticsearch 的快照功能

  • 将快照存储到远程存储(如 S3、NFS)

  • 定期验证备份的可用性

  1. 恢复流程
  • 制定详细的恢复步骤文档

  • 定期演练恢复流程

  • 确保备份数据的完整性和一致性

  1. 灾难恢复
  • 部署多节点集群

  • 配置自动故障转移

  • 建立异地灾备环境

10.4 性能优化建议

基于不同规模的日志量,提供以下性能优化建议:

日志规模服务器配置关键优化参数
小规模(<100MB / 天)2 核 4GB 内存单节点部署,默认配置
中规模(100MB-10GB / 天)4 核 8GB 内存Logstash workers=4,Elasticsearch 堆大小 4GB
大规模(10GB-100GB / 天)8 核 16GB 内存集群部署,启用消息队列
超大规模(>100GB / 天)多节点集群分布式架构,冷热节点分离

十一、总结

通过本指南的详细步骤,可在 Ubuntu 24.04 服务器上部署了完整的 ELFK 日志收集系统。这个系统能够实现:

  1. 集中式日志管理:将分散在各个服务器上的日志统一收集和管理

  2. 实时日志分析:通过 Elasticsearch 的近实时搜索能力,快速定位问题

  3. 可视化监控:使用 Kibana 创建仪表盘,直观展示系统运行状态

  4. 灵活的日志处理:通过 Logstash 的插件化架构,可以处理各种格式的日志

  5. 轻量级采集:Filebeat 资源占用极低,适合大规模部署

在生产环境中使用时,建议根据实际需求进行性能优化和安全加固。同时,建立完善的监控和告警体系,确保系统的稳定运行。

ELFK 系统的强大之处不仅在于其功能的完整性,更在于其高度的可扩展性。您可以根据具体需求添加更多的 Beats 组件(如 Metricbeat 采集系统指标、Packetbeat 采集网络数据),或者集成其他系统(如 APM 应用性能监控),构建一个全方位的运维监控平台。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐