Elastic Stack部署使用
一 、elk stack 简述
ELK 早期是 Elasticsearch + Logstash + Kibana 三个组件的简称,现在官方统一命名为 Elastic Stack,增加了 Beats 系列采集组件,专门用来做日志收集、日志清洗、存储检索、可视化分析、告警,是运维最主流的日志解决方案。
1.1 核心三大件
- Elasticsearch 分布式搜索引擎、存储引擎。 负责存储、索引、检索日志 / 数据,提供 RESTful API,底层基于 Lucene。
- Logstash 数据采集处理管道。 负责接收、过滤、转换、输出数据;支持丰富输入输出插件,对日志做清洗、格式化、字段提取。
- Kibana 可视化 Web 界面。 对接 Elasticsearch,做日志查询、图表、仪表盘、告警,Web 操作 ES。
1.2 常用配套组件(扩展)
1.2.1 Beats
轻量采集器,替代 Logstash 做客户端采集,部署在业务服务器上。
- Filebeat:采集日志文件(最常用)
- Metricbeat:采集系统 / 服务指标(CPU、内存、进程、数据库)
- Packetbeat:网络流量抓包分析
- Heartbeat:服务存活探测(uptime 监控)
- Auditbeat:系统审计日志采集
典型架构:Filebeat → Logstash → Elasticsearch ← Kibana
经典数据流:业务机器(Filebeat) → Logstash(清洗) → Elasticsearch(存储索引) ← Kibana(查看)
很多生产环境:Filebeat 直接输出 ES,省略 Logstash,简化架构。
简单区分:Logstash:功能强、占资源,适合服务端集中处理;Beats:轻量,部署在业务机器上做采集
1.2.2 其他重要组件
- Elastic Agent:新一代统一代理,可以整合所有 Beats 功能,单 agent 采集日志 + 指标 + 安全数据。
- APM Server:应用性能监控,收集链路追踪、应用指标、错误日志。
- Elasticsearch Security:安全模块,权限、认证、加密。
- Logstash Pipeline:管道处理,也支持持久队列防止丢数据。
二、elk stack组件安装
2.1 Elasticsearch部署
官网地址:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch
开源地址:https://github.com/elastic/elasticsearch
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
查看版本支持的操作系统:https://www.elastic.co/support/matrix
2.1.1 下载二进制包并配置
下载 Elasticsearch 二进制包,并指定解压到 /usr/local 目录下,并重命名为 elasticsearch :
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.5.2-linux-x86_64.tar.gz
tar -xzf elasticsearch-9.5.2-linux-x86_64.tar.gz
mv elasticsearch-9.5.2 /usr/local/elasticsearch配置环境变量:
cat > /etc/profile.d/elasticsearch.sh <<'EOF'export ES_HOME=/usr/local/elasticsearchexport PATH=$PATH:$ES_HOME/binEOF
source /etc/profile验证版本:
[root@localhost /root]# elasticsearch -Vwarning: ignoring JAVA_HOME=/usr/local/java/jdk; using bundled JDKVersion: 9.5.2, Build: tar/b42549c72e6e040825b13e5d8ebf7ff63886b24d/2026-08-18T10:07:58.745010960Z, JVM: 26.0.22.1.2 ES环境配置
- 调整系统底层参数:
# 调整虚拟内存(vm.max_map_count)sysctl -w vm.max_map_count=655360
# 写入配置文件使其永久生效echo "vm.max_map_count=655360" >> /etc/sysctl.conf
# 重新加载sysctl -p
# 验证配置sysctl vm.max_map_count-
调整文件描述符限制:编辑
/etc/security/limits.conf,添加以下配置:修改
elk用户的文件描述符限制
cat >> /etc/security/limits.conf << 'EOF'elk soft nofile 65535elk hard nofile 65535EOF-
创建专用用户并赋权:
Elasticsearch 禁止使用 root 用户启动。需要创建专用用户并赋予安装目录权限:
# 创建 elk 用户组groupadd -r elk
# 创建 elk 用户,指定主组为 elk,并限制登录和家目录useradd -r -g elk -s /sbin/nologin -M elk
# 赋予目录权限chown -R elk:elk /usr/local/elasticsearch-
创建数据目录并赋权:
在
/usr/local/elk/data/es目录中创建两个目录分别为data和logs,分别存放数据和日志:
mkdir -p /usr/local/elk/data/es/{data,logs}赋予 elk 用户和 elk 组所有权:
chown -R elk:elk /usr/local/elk2.1.3 ES配置文件修改
elasticsearch.yml 是 Elasticsearch 主要的配置文件,包含了很多参数信息。在 /usr/local/elasticsearch/config 目录下,编辑 elasticsearch.yml文件,配置以下内容:
# 备份原配置文件cp /usr/local/elasticsearch/config/elasticsearch.yml{,.bak}
# 指定集群名称:sed -i '/#cluster.name/c cluster.name: es-cluster' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定节点名称:node-1sed -i '/#node.name/c node.name: node-1' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定ES索引数据存储路径sed -i '/#path.data/c path.data: /usr/local/elk/data/es/data' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定日志文件存储路径sed -i '/#path.logs/c path.logs: /usr/local/elk/data/es/logs' /usr/local/elasticsearch/config/elasticsearch.yml
# 设置锁定内存以防止交换sed -i '/#bootstrap.memory_lock/c bootstrap.memory_lock: true' /usr/local/elasticsearch/config/elasticsearch.yml
# 设置ES监听所有网络接口的请求sed -i '/#network.host/c network.host: 0.0.0.0' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定Elasticsearch HTTP服务的端口。默认是9200sed -i '/#http.port/c http.port: 9200' /usr/local/elasticsearch/config/elasticsearch.yml**注意:**目前是单节点运行,因此需要进行以下配置:
# 在 cluster.name这一行的下方插入discovery.type: single-nodesed -i '/^cluster.name/a discovery.type: single-node' /usr/local/elasticsearch/config/elasticsearch.yml
# 注释初始主节点配置sed -i 's/^cluster.initial_master_nodes/# cluster.initial_master_nodes: ["localhost"]/' /usr/local/elasticsearch/config/elasticsearch.yml2.1.4 修改 JVM 内存配置
Elasticsearch 的 JVM 配置文件 /usr/local/elasticsearch/jvm.options ,这个文件用于配置 Elasticsearch 运行时的 JVM(Java 虚拟机)选项,包括堆内存的初始大小( -Xms )和最大大小( -Xmx )。编辑 jvm.options 文件,修改以下内容:
# 指定 Elasticsearch 进程的初始堆内存大小sed -i 's/## -Xms4g/-Xms2g/g' /usr/local/elasticsearch/config/jvm.options
# 指定 Elasticsearch 进程的最大堆内存大小sed -i 's/## -Xmx4g/-Xmx2g/g' /usr/local/elasticsearch/config/jvm.options2.1.5 配置启动服务并启动
创建一个名为 elasticsearch.service 的 systemd 服务单元文件,用于管理 Elasticsearch 服务,存放于/usr/lib/systemd/system目录下:
cat > /usr/lib/systemd/system/elasticsearch.service <<'EOF'[Unit]Description=ElasticsearchDocumentation=https://www.elastic.coWants=network-online.targetAfter=network-online.target
[Service]Type=forkingUser=elkGroup=elk
NotifyAccess=allRuntimeDirectory=elasticsearchPrivateTmp=trueEnvironment=ES_HOME=/usr/local/elasticsearchEnvironment=ES_PATH_CONF=/usr/local/elasticsearch/configEnvironment=ES_SD_NOTIFY=trueWorkingDirectory=/usr/local/elasticsearchExecStart=/usr/local/elasticsearch/bin/elasticsearch -d -p pidStandardOutput=journalStandardError=inherit
LimitNOFILE=65535LimitNPROC=4096LimitAS=infinityLimitFSIZE=infinityLimitMEMLOCK=infinityTimeoutStopSec=0KillSignal=SIGTERMKillMode=processSendSIGKILL=noSuccessExitStatus=143TimeoutStartSec=900
[Install]WantedBy=multi-user.targetEOF# 重载配置systemctl daemon-reload
# 启动服务systemctl start elasticsearch.service首次启动 Elasticsearch 节点时,它会自动执行以下安全设置:
- 为传输层和 HTTP 层生成TLS 证书,对应
/usr/local/elasticsearch/config/certs目录; - 将 TLS 配置设置应用于
elasticsearch.yml,即结尾的内容; - 为
elastic超级用户设置密码。
2.1.6 设置 elastic 用户密码
执行以下命令,为内置的 elastic 用户设置一个密码,这里设置为admin@123
[root@localhost /usr/local/elasticsearch]# elasticsearch-reset-password -u elastic -iwarning: ignoring JAVA_HOME=/usr/local/java/jdk; using bundled JDKThis tool will reset the password of the [elastic] user.You will be prompted to enter the password.Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:Re-enter password for [elastic]:Password for the [elastic] user successfully reset.内置用户:
| 用户名 | 作用 |
|---|---|
| elastic | 超级用户 |
| kibana_system | 用于负责Kibana连接Elasticsearch |
| logstash_system | Logstash将监控信息存储在Elasticsearch中时使用 |
| beats_system | Beats在Elasticsearch中存储监视信息时使用 |
| apm_system | APM服务器在Elasticsearch中存储监视信息时使用 |
| remote_monitoring_user | Metricbeat用户在Elasticsearch中收集和存储监视信息时使用 |
密码管理:
# 设置用户密码elasticsearch-setup-passwords interactive
# 重置密码,随机生成elasticsearch-reset-password -u elastic
# 重置密码,指定密码elasticsearch-reset-password -u elastic -i
# 随机密码elasticsearch-setup-passwords auto2.1.7 访问ES
浏览器访问 Elasticsearch 平台地址 https://<IP>:9200 ,在弹出的窗口中输入用户名为 elastic ,密码为之前设置的 admin@123 ,进行登录。登录成功后将出现以下内容:
{ "name" : "node-1", "cluster_name" : "es-cluster", "cluster_uuid" : "h8z6N-qAQD6PYN_kfsvCYg", "version" : { "number" : "9.5.2", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "b42549c72e6e040825b13e5d8ebf7ff63886b24d", "build_date" : "2026-08-18T10:07:58.745010960Z", "build_snapshot" : false, "lucene_version" : "10.5.1", "minimum_wire_compatibility_version" : "8.19.0", "minimum_index_compatibility_version" : "8.0.0" }, "tagline" : "You Know, for Search"}2.1.8 调用API查看ES
# 查看内置用户curl -sk -u elastic:admin@123 "https://localhost:9200/_security/user" | jq
# 只提取出所用的用户curl -sk -u elastic:admin@123 "https://localhost:9200/_security/user" | jq -r 'keys[]'
# 集群状态curl -k -u elastic:admin@123 https://localhost:9200/_cluster/health?pretty
# 节点状态curl -k -u elastic:admin@123 https://localhost:9200/_nodes/process?pretty
# 分片状态curl -k -u elastic:admin@123 https://localhost:9200/_cat/shards
# 索引分片存储信息curl -k -u elastic:admin@123 https://localhost:9200/index/_shard_stores?pretty
# 索引状态curl -k -u elastic:admin@123 https://localhost:9200/index/_stats?pretty
# 索引元数据curl -k -u elastic:admin@123 https://localhost:9200/index?pretty
# 索引信息curl -k -u elastic:admin@123 https://localhost:9200/_cat/indices?v
# 节点信息curl -k -u elastic:admin@123 https://localhost:9200/_cat/nodes?v2.2 Kibana部署
官网地址:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana
Kibana 是 Elastic Stack(ELK)的Web 可视化前端组件,基于 Node.js 开发,专门对接 Elasticsearch,提供浏览器操作 ES 的界面。
一、核心作用:
- 日志检索(Discover):查看、过滤、搜索 ES 里存储的日志,按时间、关键词、字段排查问题。
- 数据可视化:将 ES 数据做成折线图、饼图、表格等图表。
- 仪表盘 Dashboard:把多个图表组合成监控大屏,直观展示指标。
- 开发工具 Dev Tools:直接执行 ES 的 REST API,调试查询语句。
- 告警与报告:根据日志条件触发告警,生成报表。
- 权限管理(X‑Pack):用户、角色控制,限制不同人员访问不同索引。
二、注意点:
- 本身不存储数据,所有数据都来自 Elasticsearch;
- 需要和 ES 版本严格保持一致,版本不匹配会报错;
- 常用端口:5601;
- 可以配置索引模式,告诉 Kibana 读取 ES 哪些索引。
2.2.1 下载二进制包并配置环境
下载 Kibana 二进制包,并指定解压到 /usr/local 目录下,并重命名为 kibana :
cd /usr/local/src/
wget https://artifacts.elastic.co/downloads/kibana/kibana-9.5.2-linux-x86_64.tar.gz
tar -xzf kibana-9.5.2-linux-x86_64.tar.gz
mv kibana-9.5.2 /usr/local/kibana
chown -R elk:elk /usr/local/kibana创建数据目录,并给目录赋权
mkdir -p /usr/local/elk/data/kibana/{data,logs}
chown -R elk:elk /usr/local/elk/data/kibana2.2.2 Kibana配置文件修改
kibana.yml是 Kibana 主要的配置文件,包含了很多参数信息。在 /usr/local/kibana/config 目录下,编辑 kibana.yml 文件,配置以下内容:
# 备份原配置文件cp /usr/local/kibana/config/kibana.yml{,.bak}
# 修改新配置文件cat > /usr/local/kibana/config/kibana.yml <<EOF# 监听端口server.port: 5601server.host: "0.0.0.0"# 指定Kibana在生成URL时使用的基础URLserver.publicBaseUrl: "http://$(hostname -I | awk '{print $1}')"# 指定Kibana数据存储路径path.data: /usr/local/elk/data/kibana/data# 配置Kibana的日志记录设置,指示将日志记录到指定的文件中logging.appenders.default: type: file fileName: /usr/local/elk/data/kibana/logs/kibana.log layout: type: jsonEOF2.2.3 配置启动服务并启动
创建一个名为 kibana.service 的 systemd 服务单元文件,用于管理 Kibana 服务,存放于/usr/lib/systemd/system目录下:
cat > /usr/lib/systemd/system/kibana.service <<'EOF'[Unit]Description=KibanaDocumentation=https://www.elastic.coWants=network-online.targetAfter=network-online.target
[Service]Type=simpleUser=elkGroup=elkPrivateTmp=trueEnvironment=KBN_HOME=/usr/local/kibanaEnvironment=KBN_PATH_CONF=/usr/local/kibana/configWorkingDirectory=/usr/local/kibanaExecStart=/usr/local/kibana/bin/kibanaStandardOutput=journalStandardError=inheritRestart=on-failureRestartSec=3StartLimitBurst=3StartLimitInterval=60
[Install]WantedBy=multi-user.targetEOF# 重载配置systemctl daemon-reload
# 启动服务systemctl start kibana.service2.2.4 生成注册令牌并访问Kibana
ES重新生成新的注册令牌
# -s参数即 --scope参数,用来指定生成的token用途。elasticsearch-create-enrollment-token -s kibana
# 输出信息如下eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMjIuNTEuOTE6OTIwMCJdLCJmZ3IiOiI3ZmM1ZGMzMmNmMjg4NjA2ZGE5ZWFiNTNmZTU1MDNlZmU4YWU0ZDIzNDBlNzJlMzE4MDY4N2UzYzExY2Q1NGRkIiwia2V5IjoidUNUMVZxQUJmWmJmekptLWpEbXY6UldNYURmQlVxN3hPUF94dXZnUEREdyJ9浏览器访问 Kibana 平台地址 <IP>:5601 ,输入生成的注册令牌,然后点击配置Elastic
之后需要在Kibana服务器运行bin\kibana-verification-code获取验证码,然后输入
[root@localhost /usr/local/kibana/bin]# ./kibana-verification-codeYour verification code is: 568 767在浏览器上配置Kibana完毕后,回到后台,查看 kibana.yml 文件,结尾会自动新增配置。该配置在后续部署Logstash时会用到
[root@localhost /usr/local/kibana/bin]# cat /usr/local/kibana/config/kibana.yml | tail -n5elasticsearch.hosts: [https://10.22.51.91:9200]elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3ODgxNjU3NTk4NzQ6ZlEzbkZvRG1SQ1dQY1Q1SnFid01EUQelasticsearch.ssl.certificateAuthorities: [/usr/local/kibana/data/ca_1788165761022.crt]xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [https://10.22.51.91:9200], ca_trusted_fingerprint: 7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd}]Search Autocomplete搜索自动完成设置:
elasticsearch.hosts:定义 Kibana 要连接的 Elasticsearch 节点地址。elasticsearch.serviceAccountToken:这是一个 Service Account Token(服务账户令牌),Kibana 启动时用它来认证自己,而不是用用户名/密码。elasticsearch.ssl.certificateAuthorities: 指定 CA 根证书文件路径,Kibana 会用这个证书去验证 Elasticsearch 的 HTTPS 证书,确保连接的是真实可信的 ES 节点,而不是中间人攻击。这个.crt文件是 ES 第一次启动时自动生成的,通常会被 Kibana enrollment 过程复制过来。xpack.fleet.outputs:这是 Fleet(Elastic Agent 管理功能) 的输出配置。Kibana 里的 Fleet 需要知道往哪里写数据,这里配置了一个默认的 Elasticsearch 输出。关键字段:id: fleet-default-output:输出 ID。name: default:输出名称。is_default: true:是否作为默认输出。is_default_monitoring: true:是否作为监控默认输出。type: elasticsearch:输出类型是 Elasticsearch。hosts: [https://10.22.51.91:9200]:输出目标 ES 节点。ca_trusted_fingerprint:CA 证书指纹,用来验证 TLS 连接的安全性。
2.3 Logstash部署
官网地址:https://www.elastic.co/docs/reference/logstash
安装文档:https://www.elastic.co/docs/reference/logstash/installing-logstash
Logstash 是 Elastic Stack 的数据处理管道工具,Java 编写,用来做日志 / 数据的接收、清洗转换、转发输出。
三大核心模块:
- Input 输入:接收数据源,支持 file、beats、kafka、syslog、tcp 等,获取原始数据。
- Filter 过滤(核心):数据清洗,切割文本、提取字段、时间格式化、数据过滤、数据脱敏、字段增删改。
- Output 输出:处理完成后输出,最常见输出到 Elasticsearch,也可输出 kafka、文件、redis 等。
特点:
- 插件生态极其丰富,各类输入、过滤、输出都有插件;
- 资源消耗较高,占用 CPU 内存大,生产环境一般集中部署,不装在业务服务器上;
- 常接收 Filebeat 推送过来的数据,做集中清洗;
- 自带持久队列,防止宕机丢失数据。
典型定位:
-
Filebeat 负责采集,Logstash 负责清洗加工,加工完交给 Elasticsearch 存储。
-
如果日志已经是规整 JSON 格式,可跳过 Logstash,Filebeat 直接写入 ES,减少组件开销。
2.3.1 下载二进制包并配置环境
下载 Logstash 二进制包,并指定解压到 /usr/local 目录下,并重命名为 logstash :
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/logstash/logstash-9.5.2-linux-x86_64.tar.gz
tar -xf logstash-9.5.2-linux-x86_64.tar.gz
mv logstash-9.5.2 /usr/local/logstash配置环境变量:
echo 'export PATH=$PATH:/usr/local/logstash/bin' > /etc/profile.d/logstash.shsource /etc/profile验证版本:
[root@localhost /root]# logstash -VUsing bundled JDK: /usr/local/logstash/jdklogstash 9.5.22.3.2 配置Logstash
通过 chown 命令递归地更改 /usr/local/logstash 目录及其所有子目录和文件的所有权,赋予 elk 用户和 elk 组所有权:
chown -R elk:elk /usr/local/logstash/在/usr/local/elk/data/logstash目录下创建两个目录分别为data和logs,分别存放数据和日志。同时授予权限:
mkdir -p /usr/local/elk/data/logstash/{data,logs}
chown -R elk:elk /usr/local/elk/data/logstash复制 Elasticsearch 证书到 Logstash 目录并赋权:
mkdir /usr/local/logstash/config/certs
cp /usr/local/elasticsearch/config/certs/http_ca.crt /usr/local/logstash/config/certs
chmod 660 /usr/local/logstash/config/certs/http_ca.crt
chown -R elk:elk /usr/local/logstash/config/certs2.3.3 修改logstash配置文件
logstash.yml 是 Logstash 主要的配置文件,包含了很多参数信息。在 /usr/local/logstash/config 目录下,编辑 logstash.yml 文件,配置以下内容,其中**【X-Pack Settings】配置**可以从前面配置Kibana时自动生成到配置文件中的最后的内容信息中获取:
# 备份原配置文件cp /usr/local/logstash/config/logstash.yml{,.bak}
# 修改新配置文件cat > /usr/local/logstash/config/logstash.yml <<'EOF'# 指定 Logstash 用于存储数据的路径path.data: /usr/local/elk/data/logstash/data
log.level: info# 指定 Logstash 日志文件的存储路径path.logs: /usr/local/elk/data/logstash/logs# 启用 X-Pack 监控功能,允许 Logstash 发送监控数据到 Elasticsearchxpack.monitoring.enabled: true# 连接 Elasticsearch 的认证信息xpack.monitoring.elasticsearch.username: elasticxpack.monitoring.elasticsearch.password: admin@123# 指定用于监控的 Elasticsearch 集群的地址xpack.monitoring.elasticsearch.hosts: ["https://localhost:9200"]# 指定用于验证 Elasticsearch 集群 SSL 连接的 CA 证书路径。xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/local/logstash/config/certs/http_ca.crt"EOF2.3.4 修改startup.options 文件
startup.options 是 Logstash 的一个配置文件,用于定义 Logstash 启动时使用的一些系统级参数和设置。该文件通常用于配置 Logstash 作为系统服务运行时的参数,例如指定 JVM 内存设置、日志路径等。配置完成后,这些选项会被应用于 systemd 或其他服务管理器,以便正确启动和管理 Logstash 服务。
在 /usr/local/logstash/config 目录下,编辑 startup.options 文件,配置以下内容:
# 指定 Logstash 安装的位置sed -i '/LS_HOME=/c LS_HOME=/usr/local/logstash' /usr/local/logstash/config/startup.options
# 指定 Logstash 配置文件的目录sed -i '/LS_SETTINGS_DIR=/c LS_SETTINGS_DIR=/usr/local/logstash/config' /usr/local/logstash/config/startup.options
# 指定运行 Logstash 的用户和用户组。sed -i '/LS_USER=/c LS_USER=elk' /usr/local/logstash/config/startup.optionssed -i '/LS_GROUP=/c LS_GROUP=elk' /usr/local/logstash/config/startup.options2.3.5 修改pipelines.yml文件
pipelines.yml 是 Logstash 的一个配置文件,用于定义和管理多个数据处理管道(pipelines)。在 Logstash 中,一个管道包括输入(input)、过滤器(filter)和输出(output)三个部分。pipelines.yml 文件允许在一个 Logstash 实例中运行多个独立的管道,每个管道可以有自己的输入、过滤器和输出配置。
在 /usr/local/logstash/config 目录下,编辑 pipelines.yml 文件,配置以下内容:
# 备份原配置文件cp /usr/local/logstash/config/pipelines.yml{,.bak}
# 修改新配置文件,添加两个管道示例cat > /usr/local/logstash/config/pipelines.yml <<'EOF'# pipeline1:处理nginx日志- pipeline.id: nginx-log# 指定管道配置文件的路径。每个管道都有自己的配置文件,包含 input、filter 和 output 的具体配置 path.config: "/usr/local/logstash/pipelines/nginx/*.conf" pipeline.workers: 2
# pipeline2:处理业务应用日志- pipeline.id: app-log# 匹配该目录下所有.conf文件,全部合并成同一个 pipeline path.config: "/usr/local/logstash/pipelines/app/*.conf" pipeline.workers: 4EOF这里先创建了两个管道的基础设置(理解为管道外壳),还缺少具体的处理流程。在后续第4章节会在/usr/local/logstash/pipelines/nginx/目录下创建包含input、filter、output的处理流程文件
常用参数:
Terminal window - pipeline.id: my-pipeline-1 # 【必选】管道唯一ID,日志里会显示,用于区分不同业务path.config: "/etc/logstash/conf.d/p1/*.conf" # 【必选】管道加载的配置文件路径,支持通配符path.queue: "/var/lib/logstash/queue/my-p1" # 持久化队列存储目录,每个pipeline独立队列目录queue.type: persisted # 队列类型:memory(内存,默认) / persisted(磁盘持久队列,宕机不丢消息)queue.max_bytes: 4gb # 持久队列最大磁盘占用,达到就阻塞inputqueue.checkpoint.writes: 1024 # 每多少条写一次checkpoint磁盘快照queue.drain: true # 关闭实例时,是否把队列剩余数据消费完成再退出pipeline.workers: 4 # filter+output 工作线程数,默认CPU核心数pipeline.batch.size: 125 # 批量大小:每次攒多少条事件交给filter/output处理pipeline.batch.delay: 50 # 批量等待超时(毫秒):凑不够batch.size最多等多久就提交pipeline.ordered: auto # 事件顺序:auto(true/false);开启会降低吞吐量,保证事件原始顺序pipeline.java_execution: true # 使用Java执行引擎(Logstash 8+默认开启)config.reload.automatic: true # 是否自动监控配置文件变更,重载pipelineconfig.reload.interval: 3s # 配置文件扫描间隔config.debug: false # 打印配置调试信息dead_letter_queue.enable: true # 开启死信队列DLQ,处理解析失败无法处理的事件dead_letter_queue.max_bytes: 1gb # DLQ最大占用磁盘dead_letter_queue.path: "/var/lib/logstash/dlq/my-p1" # DLQ存储路径
2.3.6 配置启动服务
创建一个名为 logstash.service 的 systemd 服务单元文件,用于管理 Logstash 服务,存放于/usr/lib/systemd/system目录下:
CAP_NET_BIND_SERVICE目的正是使其能够使用 syslog 514 端口(因为1024以下的端口只能root进行监听)
cat > /usr/lib/systemd/system/logstash.service <<'EOF'[Unit]Description=logstashDocumentation=https://www.elastic.coWants=network-online.targetAfter=network-online.target
[Service]Type=simpleUser=elkGroup=elk# 授予绑定特权端口的能力AmbientCapabilities=CAP_NET_BIND_SERVICE# 可选,限制进程可用的能力集合(保持一致)CapabilityBoundingSet=CAP_NET_BIND_SERVICEWorkingDirectory=/usr/local/logstashExecStart=/usr/local/logstash/bin/logstash --path.settings /usr/local/logstash/config/Restart=alwaysNice=19LimitNOFILE=16384TimeoutStopSec=0
[Install]WantedBy=multi-user.targetEOF# 重载配置systemctl daemon-reload
# 启动服务systemctl start logstash.service2.4 Beats 组件
官网地址:https://www.elastic.co/docs/reference/beats/filebeat
安装文档:https://www.elastic.co/docs/reference/beats/filebeat/running-with-systemd
开源地址:https://github.com/elastic/beats/blob/master/filebeat/README.md
Beats 是 Elastic Stack 提供的一系列轻量级数据采集器,用 Go 语言开发,体积小、资源占用低,部署在业务主机上做数据采集,采集后可输出给 Logstash、Elasticsearch、Kafka。

- Filebeat 日志文件采集器,最常用。读取服务器磁盘上的日志文件(nginx、应用程序日志),支持断点续传,日志滚动。
- Metricbeat 指标采集器。采集系统指标(CPU、内存、磁盘、网络),也可以采集中间件指标,MySQL、Nginx、Redis 等服务运行指标。
- Packetbeat 网络数据包采集器。抓包分析网络流量,解析 TCP/UDP 等协议,统计网络请求、延时、访问情况。
- Winlogbeat Windows 专属采集器。专门读取 Windows 系统事件日志,系统安全日志、应用事件日志。
- Auditbeat 审计采集器。收集 Linux 系统审计信息,监控文件改动、用户操作行为,用于安全审计。
- Heartbeat 状态探测采集器。主动探测服务可用性,检测端口、HTTP 接口是否存活,做服务可用性监控。
2.4.1 FileBeat部署
下载 Filebeat 二进制包,并指定解压到 /usr/local 目录下,并重命名为 filebeat :
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-9.5.2-linux-x86_64.tar.gz
tar -xf filebeat-9.5.2-linux-x86_64.tar.gz
mv filebeat-9.5.2-linux-x86_64 /usr/local/filebeat创建数据目录:在 usr/local/elk/data/filebeat 目录下创建两个目录分别为 data 和 logs ,分别存放数据和日志:
mkdir -p /usr/local/elk/data/filebeat/{data,logs}2.4.2 修改FileBeat配置文件
filebeat.yml 是 Filebeat 主要的配置文件,包含了很多参数信息。在 /usr/local/filebeat 目录下,编辑 filebeat.yml 文件,配置以下内容:(这里配置采集的数据直接发给ES,不经过Logstash)
# 备份原配置文件cp /usr/local/filebeat/filebeat.yml{,.bak}
# 修改新配置文件cat > /usr/local/filebeat/filebeat_es.yml <<'EOF'# ============================== 1. 输入源配置 (Inputs) ==============================# 定义 Filebeat 需要采集的日志来源filebeat.inputs: - type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转 id: my-messages-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度 enabled: true # 启用状态:设置为 true 表示开启此采集规则 paths: # 采集路径:指定要读取的日志文件或目录(支持通配符) - /var/log/messages # 此处指定采集 Linux 系统的 messages 日志
# ============================== 2. 索引模板配置 (Template) ==============================setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效
# ============================== 3. 模块配置 (Modules) ==============================# 控制 Filebeat 预置模块的加载行为filebeat.config.modules: path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录 reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效
# ============================== 4. 输出配置 (Output) ==============================# 定义采集到的日志数据最终发送到的目的地output.elasticsearch: hosts: ["https://localhost:9200"] # ES 集群地址:Elasticsearch 节点的 IP 和端口 index: "test-%{+yyyy.MM.dd}" # 自定义索引名:按天生成索引,例如 test-2026.09.01
# --- SSL/TLS 加密与认证配置 --- ssl.verification_mode: none # 证书验证模式:none 表示不验证服务端证书(适用于自签名证书环境) ssl.certificate_authorities: # CA 证书路径:指定用于验证 ES 服务端证书的根证书文件路径 - "/usr/local/elasticsearch/config/certs/http_ca.crt"
# --- 访问凭证 --- username: "elastic" # 认证用户名:连接 Elasticsearch 所需的账号 password: "admin@123" # 认证密码:连接 Elasticsearch 所需的密码(️ 生产环境建议使用 Keystore 加密)EOF默认模板简化:
Terminal window # ====================== 输入源配置 ======================filebeat.inputs:# 文件流输入:采集本地日志文件- type: filestreamid: my-filestream-id # 输入项唯一IDenabled: false # 是否启用该输入paths: # 待采集日志路径,支持通配符- /var/log/*.log#exclude_lines: ['^DBG'] # 排除匹配正则的日志行#include_lines: ['^ERR', '^WARN'] # 只采集匹配正则的日志行#prospector.scanner.exclude_files: ['.gz$'] # 排除匹配的文件#fields: # 自定义附加字段# level: debug# review: 1# journald输入:采集系统journald日志#- type: journald# id: my-journald-id # 输入项唯一ID# seek: head # 读取起始位置:head开头/tail尾部/since指定时间# since: -24h # 起始时间偏移(seek=since时生效)# units: # 指定采集的systemd服务# - docker.service# ====================== 模块配置 ======================filebeat.config.modules:path: ${path.config}/modules.d/*.yml # 模块配置文件路径reload.enabled: false # 是否开启配置热重载#reload.period: 10s # 配置文件检查周期# ====================== ES索引模板 ======================setup.template.settings:index.number_of_shards: 1 # 索引分片数量#index.codec: best_compression # 索引压缩编码#_source.enabled: false # 是否关闭_source字段存储# ====================== 通用配置 ======================#name: # 采集器标识名称#tags: ["service-X", "web-tier"] # 全局标签,用于分类过滤#fields: # 全局附加字段# env: staging# ====================== Kibana配置 ======================setup.kibana:#host: "localhost:5601" # Kibana服务地址#space.id: # Kibana空间ID# ====================== Elastic Cloud ======================#cloud.id: # Cloud实例ID,覆盖ES/Kibana地址#cloud.auth: # Cloud认证,格式 user:pass# ====================== 输出配置 ======================# Elasticsearch输出output.elasticsearch:hosts: ["localhost:9200"] # ES节点地址列表preset: balanced # 性能预设:balanced/throughput/scale/latency/custom#protocol: "https" # 通信协议#api_key: "id:api_key" # API密钥认证#username: "elastic" # 用户名认证#password: "changeme" # 密码认证# Logstash输出#output.logstash:# hosts: ["localhost:5044"] # Logstash地址列表# ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # CA根证书# ssl.certificate: "/etc/pki/client/cert.pem" # 客户端证书# ssl.key: "/etc/pki/client/cert.key" # 客户端私钥# ====================== 数据处理器 ======================processors:- add_host_metadata:when.not.contains.tags: forwarded # 无forward标签时添加主机元数据- add_cloud_metadata: ~ # 添加云环境元数据- add_docker_metadata: ~ # 添加Docker容器元数据- add_kubernetes_metadata: ~ # 添加K8s元数据# ====================== 自身日志 ======================#logging.level: debug # 日志级别:error/warning/info/debug#logging.selectors: ["*"] # 启用日志的组件# ====================== X-Pack监控 ======================#monitoring.enabled: false # 是否开启监控上报#monitoring.cluster_uuid: # 监控集群UUID#monitoring.elasticsearch: # 监控专用ES集群配置# ====================== 链路追踪 ======================#instrumentation:# enabled: false # 是否启用APM埋点# environment: "" # 运行环境# hosts: # APM Server地址# - http://localhost:8200# api_key: # APM API密钥# secret_token: # APM密钥令牌# ====================== 版本迁移 ======================#migration.6_to_7.enabled: true # 启用6.x到7.x迁移别名
2.4.3 配置测试
# 测试配置文件语法是否正确[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test configConfig OK
# 测试能否连通 Elasticsearch[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test outputelasticsearch: https://localhost:9200... parse url... OK connection... parse host... OK dns lookup... OK addresses: 127.0.0.1, 127.0.1.1, ::1 dial up... OK TLS... security... WARN server's certificate chain verification is disabled handshake... OK TLS version: TLSv1.3 dial up... OK talk to server... OK version: 9.5.2
# 前台运行查看实时日志(确认没有报错)/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml2.4.4 配置启动服务
创建一个名为 filebeat.service 的 systemd 服务单元文件,用于管理 Filebeat 服务,存放于/usr/lib/systemd/system目录下:
cat > /usr/lib/systemd/system/filebeat.service <<'EOF'[Unit]Description=Filebeat sends log files to Logstash or directly to Elasticsearch.Documentation=https://www.elastic.co/beats/filebeatWants=network-online.targetAfter=network-online.target
[Service]UMask=0027Environment="GODEBUG='madvdontneed=1'"Environment="BEAT_LOG_OPTS="Environment="BEAT_CONFIG_OPTS=-c /usr/local/filebeat/filebeat.yml"Environment="BEAT_PATH_OPTS=--path.home /usr/local/filebeat --path.config /usr/local/filebeat --path.data /usr/local/elk/data/filebeat/data --path.logs /usr/local/elk/data/filebeat/logs"ExecStart=/usr/local/filebeat/filebeat --environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTSRestart=always
[Install]WantedBy=multi-user.targetEOF# 重载配置systemctl daemon-reload
# 启动服务systemctl start filebeat.service三、Kibana组件使用
官方中文文档:Kibana 用户手册 | Elastic
3.1添加数据视图
由于之前部署Beats组件时将采集的数据发送到ES,且在配置中自定义了索引名称(test-%{+yyyy.MM.dd}),Kibana 默认不会自动显示它。
3.1.1 确认数据已成功写入ES
在去 Kibana 之前,建议先在终端确认数据确实已经写进去了:
能看到类似 test-2026.09.01 的索引,说明数据已成功写入
# 先写入数据echo "你好世界" >> /var/log/messages
# 检查是否存在以 test- 开头的索引curl -k -u elastic:sunline https://localhost:9200/_cat/indices?v | grep test-
# 结果如下:[root@localhost /root]# curl -k -u elastic:admin@123 https://localhost:9200/_cat/indices?v | grep test- % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 780 0 780 0 0 13088 0 --:--:-- --:--:-- --:--:-- 13220yellow open test-2026.09.01 sBBj_X_ISgm0HELW1Wl6XQ 1 1 7 0 56.4kb 56.4kb 56.4kb3.1.2 在Kibana中创建数据视图
-
打开浏览器,访问 Kibana 界面(默认地址:
https://<Kibana服务器IP>:5601),使用elastic/admin@123登录。 -
在左侧菜单栏,向下滚动找到 Management点击进入

image-20260901155359207 -
进入后找到
Kibana下的数据视图点击,进入后选择创建数据视图
image-20260901155505367 -
索引模式填入**test-***与Filebeat 配置中的test-%{+yyyy.MM.dd}相匹配,点击保存
image-20260901155703959 -
可以看到监控的一些字段数据

image-20260901161840335
3.2 使用Discover模块查看数据


3.3 创建可视化图表


可以添加图层

最后点击保存并添加到库中

3.4 创建仪表盘


可选择新建、或者使用库中的图标


最后的效果:

四、Logstash组件使用
这里使用一个案例来阐述Logstash组件的基本使用:监控nginx的日志文件,这次Filebeat的链路走向不直接对接ES,而是先交给Logstash进行过滤清洗,然后再交给ES。整个链路走向为 Filebeat → Logstash → Elasticsearch 。最后在 Kibana 中完成可视化
4.1 配置 Logstash
Logstash 负责接收 Filebeat 的数据,解析 Nginx 日志格式,然后写入 ES。
-
在 Logstash 的配置目录下创建或修改配置文件。(根据2.3的管道示例,这里需要在
/usr/local/logstash/pipelines/nginx目录下创建配置文件)Terminal window # 创建目录mkdir -p /usr/local/logstash/pipelines/nginx/ -
配置 Input 接收 Filebeat 数据,Filter 解析日志,Output 写入 ES:
cat > /usr/local/logstash/pipelines/nginx/nginx-log.conf << 'EOF'input { beats { port => 5044 # 监听端口,需与 Filebeat 配置一致 }}
filter { # 使用 Grok 插件解析非结构化的 Nginx 访问日志 grok { match => { "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}' } break_on_match => false }}
output { elasticsearch { hosts => ["https://localhost:9200"] # ES 地址 index => "nginx-logs-%{+YYYY.MM.dd}" # 按天生成索引 # 如果 ES 开启了安全认证,需加上用户名和密码 user => "elastic" password => "admin@123" ssl_verification_mode => "none" # 不验证证书 }}EOF# 修改用户所有权chown -R elk:elk /usr/local/logstash
# 重启systemctl restart logstash.service
# 查看5044端口是否开启监听netstat -tunlp | grep 50444.2 配置 Filebeat
Filebeat 部署在 Nginx 所在的服务器,负责实时采集日志并推送到 Logstash。
-
修改 Filebeat 的配置文件
filebeat.yml。 -
配置输入源(Nginx 日志路径)和输出目标(Logstash):
因在2.4.2配置过一个将采集的日志直接发送到ES,这里直接去掉,保留的话可以查看后面的另一个流程
# 备份之前的文件cp /usr/local/filebeat/filebeat.yml{,.bak.bak}
# ============================== 1. 输入源配置 (Inputs) ==============================# 定义 Filebeat 需要采集的日志来源filebeat.inputs: - type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转 id: my-nginx-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度,ID不可与其他输入源重复 enabled: true # 启用状态:设置为 true 表示开启此采集规则 paths: # 采集路径:指定要读取的日志文件或目录(支持通配符) - /var/log/nginx/*.log # 需要采集的日志路径,请修改为实际日志文件
# ============================== 2. 索引模板配置 (Template) ==============================# 当前输出为Logstash,模板配置不会生效,保留配置文件结构不删除setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效
# ============================== 3. 模块配置 (Modules) ==============================# 控制 Filebeat 预置模块的加载行为filebeat.config.modules: path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录 reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效
# ============================== 4. 输出配置 (Output) ==============================# 定义采集到的日志数据最终发送到的目的地output.logstash: hosts: ["127.0.0.1:5044"] # Logstash 地址端口,请修改为你的实际 Logstash 服务地址EOF保留多个采集源:
将两路日志全部推送到 logstash 的 5044 端口,依靠
fields.dest字段区分。在 Logstash 里面做分流(messages 不处理直接进 ES,nginx 日志在 logstash的filter字段 处理后进入ES)1. filebeat配置
Terminal window cat > /usr/local/filebeat/filebeat.yml << 'EOF'# ============================== 1. 输入源配置 (Inputs) ==============================# 定义 Filebeat 需要采集的日志来源filebeat.inputs:- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转id: my-messages-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度enabled: true # 启用状态:设置为 true 表示开启此采集规则paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)- /var/log/messages # 此处指定采集 Linux 系统的 messages 日志fields:dest: "es" # 自定义标记字段:用于Logstash内部分流,该路日志发送到 Elasticsearch# ========== 追加第二个采集源:nginx日志 ==========- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转id: my-nginx-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度,ID不可与其他输入源重复enabled: true # 启用状态:设置为 true 表示开启此采集规则paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)- /var/log/nginx/*.log # 需要采集的日志路径,请修改为实际日志文件fields:dest: "logstash" # 自定义标记字段:用于Logstash内部分流,该路日志留在logstash处理# ============================== 2. 索引模板配置 (Template) ==============================setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效# ============================== 3. 模块配置 (Modules) ==============================# 控制 Filebeat 预置模块的加载行为filebeat.config.modules:path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效# ============================== 4. 输出配置 (Output) ==============================# 定义采集到的日志数据最终发送到的目的地# Filebeat只允许一个output,全部数据发送给Logstash,分流逻辑交给Logstashoutput.logstash:hosts: ["127.0.0.1:5044"] # Logstash 地址端口,请修改为你的实际 Logstash 服务地址EOF2. nginx-log.conf配置
Terminal window cat > /usr/local/logstash/pipelines/nginx/nginx-log.conf << 'EOF'input {beats {port => 5044}}filter {# 只对 Nginx 日志做 grok 解析(通过 dest 字段区分),避免系统日志匹配失败if [fields][dest] == "logstash" {grok {match => {"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}'}break_on_match => false}}# 如果你也想解析 messages 日志,可以再增加一个 grok,但此处不需要}output {# 分流:dest=es 的日志(messages)写入 test-* 索引if [fields][dest] == "es" {elasticsearch {hosts => ["https://localhost:9200"]index => "test-%{+yyyy.MM.dd}"user => "elastic"password => "admin@123"ssl_verification_mode => "none" # 统一使用 8.x 写法,更简洁# 如果你的 Logstash 版本较旧,可换为:# ssl_certificate_verification => false}}# 分流:dest=logstash 的日志(nginx)写入 nginx-log-* 索引else if [fields][dest] == "logstash" {elasticsearch {hosts => ["https://localhost:9200"]index => "nginx-log-%{+yyyy.MM.dd}" # 统一用小写 yyyy,避免跨年周问题user => "elastic"password => "admin@123"ssl_verification_mode => "none"}}# 可选:调试时打开下面的 else,查看未匹配 dest 的事件(生产环境请注释掉)# else {# stdout { codec => rubydebug }# }}EOF
之后回到kibana进行数据视图、可视化图表、仪表盘的创建(具体步骤可参考第三章节)
五、APM server组件
Elastic APM Server 是 Elastic Stack(ELK Stack)中专门用于接收、处理和转发应用性能监控(APM)数据的组件。
简单来说,它充当了**应用程序(Agent)**与 **Elasticsearch(存储/分析引擎)**之间的“网关”或“缓冲层”。
- 核心功能:它接收来自各种编程语言 APM Agent 发送的性能数据(如 HTTP 请求耗时、数据库查询、错误日志、分布式追踪 Trace 等)。
- 数据处理:它对原始数据进行验证、转换和丰富(例如添加 GeoIP 信息、User-Agent 解析等),然后将其转换为 Elasticsearch 文档格式。
- 缓冲与解耦:它防止大量监控数据直接冲击 Elasticsearch 集群,起到削峰填谷的作用,同时让应用程序无需关心后端的存储细节。
- 架构演进注意:在 Elastic Stack 8.x 及更高版本中,APM Server 已经不再是一个必须独立部署的二进制文件,而是被集成到了 Elastic Agent 中作为一个托管服务运行。但在逻辑上,它的功能依然存在。
5.1 搭配的组件
- APM Agent(探针)【必须】 部署在业务应用侧,不是 APM‑Server。
- 各语言 SDK:Java Agent、Python、Go、NodeJS、.NET、PHP 等
- 作用:采集应用指标、调用链路、错误堆栈、慢请求,把数据上报给 APM Server。
- Agent 只负责采集上报,不存储数据。
- APM Server【中间转发服务】 接收 Agent 发过来的链路数据,做预处理、解析、字段增强,再写入 Elasticsearch。 两种部署:二进制、docker。
- Elasticsearch【存储,必须】 APM Server 所有链路、指标、异常数据最终全部写入 ES 索引,没有 ES 就无法持久化。
- Kibana【可视化,必须】 提供 APM 专属 UI 面板:服务地图、链路详情、慢事务、错误统计、服务指标,做查询、告警、图表展示。
5.1.1 可选组件
- Fleet Server / Elastic Agent(8.x+ 推荐):用于集中管理和部署 APM Server 集成,简化运维。
- Logstash:如果你需要在数据进入 ES 之前进行复杂的自定义 ETL 处理,可以让 APM Server 输出到 Logstash 而非直接写入 ES。
- Kafka / Redis:作为中间消息队列,当数据量极大时,可置于 APM Server 与 Elasticsearch 之间提供额外的缓冲能力。
- Machine Learning:Elastic 内置的 ML 功能可以对 APM 数据进行异常检测(如响应时间突增、流量异常等)。
最简最小组合:
业务应用 + APM Agent + APM Server + Elasticsearch + Kibana如果使用的是 Elastic Stack 8.x 或更新版本,官方推荐使用 Fleet + Elastic Agent 的方式来部署 APM Server,而不是手动下载独立的
apm-server二进制包。这种方式支持通过 Kibana UI 进行集中配置、升级和监控,大幅降低了运维复杂度。
六、Fleet组件使用
Fleet 由两部分组成:
- Fleet UI 是一个带有可视化界面的 Kibana 应用程序,用户可以在界面配置和管理 Elastic Agent 的策略,并且在 Fleet 页面上查看所有 Elastic Agent 的状态。
- Fleet Server 负责集中管理 Elastic Agent 的策略和生命周期,它提供了用于更新 Elastic Agent 的控制平面,并指示 Elastic Agent 执行一些操作,例如更新监控策略,跨主机运行 Osquery 或在网络层隔离主机以遏制安全威胁。Fleet Server 也是一个特殊的 Elastic Agent。
打开kibana的UI界面,进入Fleet(左侧菜单 → Management → Fleet):(如果进入后出现如下界面)

这是因为Kibana 的 kibana.yml 里没有配置加密密钥
# 1. 生成随机字符串作为秘钥openssl rand -hex 32# 输出结果:a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8
# 2. 将秘钥填入字段,之后将以下内容追加到kiban的配置文件中cat >> /usr/local/kibana/config/kibana.yml << 'EOF'# 用于加密 Fleet 的 enrollment token、API key 等敏感 saved objectxpack.encryptedSavedObjects.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"
# 以下两个是 9.x 强烈建议一并配置的(Alerting / Actions / Security Solution 也依赖)xpack.reporting.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"xpack.security.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"EOF
# 3. 重启kibanasystemctl restart kibana出现如下画面说明fleet可以正常使用了

6.1 创建Fleet服务器
6.1.1 快速创建
填写名称和URL,点击继续
其中URL填写的是fleet服务器的URL,后续elastic agent就是通过这个找到fleet server。
如果要修改端口,那么后续安装fleet server的命令也需要修改,默认给出的命令是8220端口

在上一步点击确认后自动生成代理策略和注册令牌,会出现以下命令,选择对应的架构安装对应的elastic agent,这里在主机(10.22.51.91)上进行安装·fleet 服务器。


# 进入下载目录cd /usr/local/src
curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-9.5.2-linux-x86_64.tar.gz
tar xzf elastic-agent-9.5.2-linux-x86_64.tar.gz
mv elastic-agent-9.5.2-linux-x86_64 /usr/local/elastic-agent
cd /usr/local/elastic-agent
# 执行命令 ./elastic-agent install \ --fleet-server-es=https://10.22.51.91:9200 \ --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3ODg0MTcxNjU2MTg6WDhsOXVJUmhReGVVZnB5NnBoeUtjZw \ --fleet-server-policy=fleet-server-policy \ --fleet-server-es-ca-trusted-fingerprint=7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd \ --fleet-server-port=8220 \ --install-servers
# 出现以下结果:输入y,会向fleet服务器下载配置文件,并安装在/opt/Elastic/AgentElastic Agent will be installed at /opt/Elastic/Agent and will run as a service. Do you want to continue? [Y/n]:y[ ] Service Started [48s] Elastic Agent successfully installed, starting enrollment.[== ] Waiting For Enroll... [50s] {"log.level":"info","@timestamp":"2026-09-03T15:12:15.206+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).prepareFleetTLS","file.name":"cmd/enroll_cmd.go","file.line":373},"message":"Generating self-signed certificate for Fleet Server","ecs.version":"1.6.0"}[== ] Waiting For Enroll... [51s] {"log.level":"info","@timestamp":"2026-09-03T15:12:16.007+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff","file.name":"cmd/enroll_cmd.go","file.line":417},"message":"Restarting agent daemon, attempt 0","ecs.version":"1.6.0"}[ ===] Waiting For Enroll... [53s] {"log.level":"info","@timestamp":"2026-09-03T15:12:18.018+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1","file.name":"cmd/enroll_cmd.go","file.line":613},"message":"Fleet Server - waiting for output unit","ecs.version":"1.6.0"}[ ===] Waiting For Enroll... [1m5s] {"log.level":"info","@timestamp":"2026-09-03T15:12:30.030+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1","file.name":"cmd/enroll_cmd.go","file.line":594},"message":"Fleet Server - Running on policy with Fleet Server integration: fleet-server-policy; missing config fleet.agent.id (expected during bootstrap process)","ecs.version":"1.6.0"}[ ===] Waiting For Enroll... [1m5s] {"log.level":"info","@timestamp":"2026-09-03T15:12:30.808+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/application/enroll.EnrollWithBackoff","file.name":"enroll/enroll.go","file.line":87},"message":"Starting enrollment to URL: https://localhost:8221/","ecs.version":"1.6.0"}[== ] Waiting For Enroll... [1m8s] {"log.level":"info","@timestamp":"2026-09-03T15:12:33.543+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff","file.name":"cmd/enroll_cmd.go","file.line":417},"message":"Restarting agent daemon, attempt 0","ecs.version":"1.6.0"}{"log.level":"info","@timestamp":"2026-09-03T15:12:33.546+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).Execute","file.name":"cmd/enroll_cmd.go","file.line":206},"message":"Successfully triggered restart on running Elastic Agent.","ecs.version":"1.6.0"}Successfully enrolled the Elastic Agent.[== ] Done [1m8s]Elastic Agent has been successfully installed.回到kibana界面,发现已经连接成功


6.1.2 高级选项创建
高级创建有更多的选项可自定义,更加灵活。这次安装fleet server使用另一台独立的机器10.22.51.74,不再与elastic组件服务器(10.22.51.91)安装在一起
这里事先创建了两个不同的代理策略,指定不同的fleet server,供不同的fleet srever使用

之后选择部署模式和fleet服务器主机

最后生成令牌,将fleet 服务器安装到对应ip(10.22.51.74)中

6.2 代理策略使用
6.2.1 代理策略概念
代理策略 = 配置模板,里面定义采集什么日志、指标、输出给谁。 业务机器安装 Elastic Agent 的时候,绑定某一个策略,Agent 就自动下载这套配置,不需要去业务机器改配置文件。
6.2.2 默认代理策略
Fleet Server Policy:专门给 Fleet‑Server 服务端用,普通业务 agent 绝对不要选它(已经有 1 个代理绑定它,就是之前的 fleet‑server 节点)
如果有多个fleet server使用不同的代理策略,建议修改代理策略的名字。同时修改策略使用的fleet 服务器(不修改则为默认)。否则将出现fleet server无法更新
对于其他的策略需要指定其需要通信的fleet server,否则使用的是默认的fleet server地址。


6.2.3 创建普通代理策略
-
点右上角【创建代理策略】新建空白策略,填写
名称后点击创建
image-20260904154851809 
image-20260904155019636
6.2.4 进入策略页面
可以看到有个默认的system集成,这是因为之前创建时勾选了收集系统日志和指标
-
添加集成:比如 Nginx、System (系统指标)、Filebeat 自定义日志、MySQL 等。这里添加
nginx的集成添加集成就是告诉 Agent:要采集什么数据。 例如
nginx监控策略这个策略,添加 Nginx 集成来采集nginx的数据。
image-20260904155416256 
image-20260904162739761
关键点:只要网页修改策略保存,所有绑定这个策略的 Agent,会自动拉取新配置,不需要登录业务机器重启 agent!Fleet 的核心价值就在这里,集中管理。
6.3 代理策略选项

6.3.1 添加 Fleet 服务器
只针对
Fleet Server Policy才有用,普通业务策略不要点! 功能:弹出向导,生成 Fleet‑Server 安装脚本,就是你最开始部署 fleet‑server 那套 install 命令。
- 作用:用于部署第二台、多台 Fleet‑Server 节点做高可用。
在 nginx监控策略 普通策略点这个是无效的,普通策略不能用来安装 Fleet‑Server。
6.3.2 添加代理
- 点击直接跳转到 Agent 安装向导,并且自动选定当前策略。
- 系统直接生成安装脚本,脚本内置绑定此策略。
- 复制脚本到业务服务器执行安装 elastic‑agent。

6.3.3 在此策略上升级代理
批量升级该策略下全部 Agent 版本。
- 当 Kibana 检测到有新版本 Elastic‑Agent 可用,这个按钮激活。
- 一键把所有绑定此策略的 agent,远程升级到新版本,不需要登录业务机器操作。
6.3.4 在此策略上卸载代理
批量远程卸载该策略下所有 Agent。 触发后,Kibana 下发指令,所有绑定该策略机器上的 elastic‑agent 执行卸载,停止服务、删除程序。
6.4 集成修改

当选择的集成采集的数据不符合要求时,可以编辑集成进行自定义
6.5 创建代理

-
选择代理策略:
nginx监控策略
image-20260904165750887 -
选择在fleet中注册

image-20260904165828303 -
在被监控的主机
10.22.51.72中执行命令
image-20260904165915976 
image-20260904170939979
七、Elastic Agent
Elastic Agent 是 Elastic 官方推出的统一数据采集与管理代理,用来替代过去散落的 Beats 家族(Filebeat、Metricbeat、Packetbeat、Heartbeat、Auditbeat、Winlogbeat…)以及独立的 APM Server,把它们的能力收敛到一个二进制、一个进程、一套配置里。
Elastic Agent = 一个跑在每台主机/容器上的”全能采集器”,由 Kibana Fleet 远程统一管理,按需开启日志、指标、APM、安全、合成监控等各种能力。
参考文档:Elastic Stack 实战教程 4:使用 Fleet 管理 Elastic Agent 监控应用 - 墨天轮
Observability:使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0-CSDN博客
7.1 基本认识
7.1.1 核心组件和概念
| 概念 | 作用 | 类比 |
|---|---|---|
| Elastic Agent | 跑在被监控机器上的实际进程,负责采集和上报 | ”士兵”:执行采集数据的角色 |
| Integration(集成) | 一个个可插拔的能力包,如 System、Nginx、MySQL、Elastic APM、Endpoint Security | ”技能卡”:规定采集哪些数据 |
| Agent Policy(代理策略) | 一组集成的集合 + 输出配置,决定”这个 Agent 要干什么" | "任务清单” |
| Fleet / Fleet Server | Kibana 里的管理中心 + 通信中转,把策略下发给所有 Agent | ”指挥部” |
工作流:
- 你在 Kibana Fleet UI 里创建一个
Policy(代理策略),往里加几个Integration(集成)(比如 System + Nginx + APM)。 - Fleet Server 把这份 Policy 推送给所有挂在该 Policy 下的 Elastic Agent。
- Agent 热加载新配置,立刻开始按新策略采集,无需重启、无需登录机器。
- 数据写入 Elasticsearch,在 Kibana 里查看。
7.1.2 核心能力
Elastic Agent 通过加载不同的 Integration(集成) 覆盖几乎所有观测与安全场景:
| 领域 | 典型 Integration | 替代的老组件 |
|---|---|---|
| 日志 | System logs、Nginx、Apache、Kafka、Docker、Kubernetes、自定义文件/JSON/Syslog | Filebeat |
| 指标 | System metrics、CPU/Memory/Disk、Prometheus scrape、各种中间件 metrics | Metricbeat |
| APM | Elastic APM | 独立 APM Server |
| 可用性监控 | HTTP/TCP/ICMP 探活 | Heartbeat |
| 合成监控 | Browser journeys(Playwright 脚本) | Synthetics |
| 安全 / EDR | Elastic Defend(Endpoint Security)、Auditd、Osquery | Auditbeat + Endpoint |
| 网络 | Flow、Packet capture | Packetbeat |
| 云 | AWS、Azure、GCP 全套服务指标和日志 | 各 cloud beat |
在 Elastic 官方的 Integrations 市场里目前有 300+ 个开箱即用的集成,点几下就能启用。
7.1.3 流程详情

- 主进程根据 Fleet 下发的 Policy,动态拉起/停止若干子 component(很多其实就是内嵌的 Beat 或 APM Server 逻辑)。
- 与 Fleet Server 之间维持长连接,实时接收策略变更、上报自身健康状态。
- 所有 component 共享同一个输出管道(ES / Logstash / Kafka),统一背压和重试。
7.1.4 运行模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Fleet-managed(推荐) | 由 Kibana Fleet 远程管理,UI 点点鼠标即可改配置 | 生产环境、规模化部署 |
| Standalone(独立) | 不连 Fleet,本地用 elastic-agent.yml 配置 | 离线环境、极简场景、调试 |
99% 的场景都应该用 Fleet-managed,也就是你前两轮在做的方向。
7.1.4.1 模式特性
| 特性 | Fleet | Standalone |
|---|---|---|
| 中央管理 | 支持 | 不支持 |
| Kibana UI | 支持 | 部分 |
| Agent Policy | 核心机制 | 本地配置 |
| Integration | 强 | 支持 |
| 大规模 Agent | 推荐 | 不推荐 |
| 自动配置下发 | 支持 | 不支持 |
| 集中升级 | 支持 | 手工 |
| 配置文件 | Fleet生成 | 自己维护 |
| 学习难度 | 中 | 低 |
| 生产环境 | 推荐 | 特殊场景 |
| Ansible 管理 | 可结合 | 很适合 |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
赣公网安备36072602000131号