ELK 平台部署操作手册(9.4)

ELK 平台部署操作手册

Elasticsearch 9.4 + Kibana 9.4 + Filebeat 9.4(单节点 · CentOS/RHEL)

一、文档说明

本手册用于在一台 Linux 服务器(CentOS/RHEL 系)上部署 ELK 日志平台:由 Elasticsearch 存储与检索日志,Kibana 提供可视化查询界面,Filebeat 部署在被采集主机上负责收集系统日志与 Nginx 日志并写入 ES。手册按"系统环境准备 → Elasticsearch 部署 → Kibana 部署 → Filebeat 部署 → 验证与排错"五个部分组织,每个步骤均包含作用说明、配置要求与可直接执行的命令,按顺序执行即可完成部署。

说明:本手册基于单节点部署示例,涉及的具体取值(服务器 IP、集群名、运行用户、安装路径、密码等)均为示例值,实际部署时请结合现场环境替换。为保证可用性,本手册已将运行用户统一为 sk_elk、安装根目录统一为 /sk_elk。

关键参数一览

|------------|---------------|--------------------------------|
| 项目 | 取值(示例) | 说明 |
| 集群名称 | sk_es9.4 | 同一集群所有节点必须一致 |
| 服务器 IP | 172.21.33.186 | 本机内网地址,集群/客户端访问入口 |
| 运行用户 / 组 | sk_elk | ES/Kibana 非 root 运行用户 |
| ES HTTP 端口 | 9200 | 对外 RESTful 接口 |
| ES 集群通信端口 | 9300 | 节点间内部通信 |
| Kibana 端口 | 5601 | Web 访问端口 |
| 安装根目录 | /sk_elk | 下设 data / logs / softwares 子目录 |
| 版本号 | 9.4.0 | ES / Kibana / Filebeat 版本保持一致 |

二、系统环境准备

Elasticsearch 对操作系统内核参数、资源限制和运行环境有明确要求。以下内容必须在安装 ES 之前完成,否则会出现启动检查失败、性能卡顿或权限报错等问题。除特别说明外,本节命令需以 root 身份执行。

2.1 调整虚拟内存区域上限(vm.max_map_count)

ES 底层依赖 mmap 机制高效管理索引文件。该值过低会触发启动检查失败(典型报错 max_map_count 不足)。将上限调大到 262144 并使其永久生效。

echo "vm.max_map_count=262144" >> /etc/sysctl.conf

sysctl -p

2.2 放宽文件句柄与线程数限制(limits.conf)

ES 运行时同时处理大量文件读写与网络连接,系统默认的文件打开数(通常 1024)远远不够。需调大最大文件打开数(nofile)与最大线程数(nproc)。以下配置通过 limits.d 下的独立文件实现,避免直接改动主配置文件。

cat > /etc/security/limits.d/es9.conf <<EOF

* soft nofile 65536

* hard nofile 65536

* soft nproc 4096

* hard nproc 4096

EOF

说明:修改后需重新登录(或重新创建会话)才会对新进程生效,可在对应用户下用 ulimit -n / ulimit -u 验证。

2.3 关闭 Swap 分区

ES 极度依赖内存进行缓存与查询。一旦系统发生 Swap 交换,会导致 ES 严重性能卡顿甚至节点假死。强烈建议禁用 Swap。

立即关闭所有 Swap 分区

swapoff -a

永久关闭:编辑 /etc/fstab,注释掉所有 swap 行后重启

2.4 关闭 SELinux

关闭 SELinux 以避免服务启动时被权限策略拦截。临时关闭立即生效;永久关闭需修改配置文件并重启服务器。

临时关闭(重启后失效)

setenforce 0

永久关闭(重启生效)

编辑 /etc/selinux/config,将 SELINUX=enforcing 改为:

SELINUX=disabled

2.5 关闭防火墙或放行必要端口

集群部署需确保节点间网络互通。可选择直接停用防火墙,或精确放行 ES 所需端口(HTTP 9200、节点通信 9300,部署 Kibana 时还需放行 5601)。

方式一:直接停用防火墙(仅建议内网测试环境)

systemctl stop firewalld && systemctl disable firewalld

方式二:精确放行端口

firewall-cmd --permanent --add-port=9200/tcp

firewall-cmd --permanent --add-port=9300/tcp

firewall-cmd --permanent --add-port=5601/tcp

firewall-cmd --reload

2.6 配置 JVM 堆内存(jvm.options)

在 config/jvm.options 中设置 JVM 堆内存。最佳实践:让初始堆 -Xms 与最大堆 -Xmx 相等,避免运行期动态扩缩内存带来的性能损耗;堆内存不超过物理内存的 50%,且绝对不要超过 32GB。

以 4GB 堆内存为例(config/jvm.options)

-Xms4g

-Xmx4g

2.7 创建专用运行用户与目录

出于安全考虑,ES 不允许使用 root 用户直接运行。需创建专用系统用户,并将 ES 安装目录、数据目录(path.data)、日志目录(path.logs)的所有权赋予该用户。

id sk_elk || sudo useradd -m -s /bin/bash -U sk_elk

sudo mkdir -pv /sk_elk/{data,logs,softwares}/es9

tar -zxf /opt/elasticsearch-9.4.0-linux-x86_64.tar.gz -C /sk_elk/softwares/es9/

sudo chown sk_elk:sk_elk -R /sk_elk/

三、部署 Elasticsearch

本部分完成 ES 主配置文件修改、安全证书生成、systemd 服务注册以及账号密码设置。以下配置示例均基于单节点部署,IP 使用 172.21.33.186。

3.1 修改主配置文件 elasticsearch.yml

配置分两部分:基础集群参数(集群名、数据/日志路径、网络绑定、节点发现)与安全认证参数(X-Pack Security 与 SSL)。启用安全后访问 ES 需要账号密码并使用 HTTPS,因此需配合 3.2 生成的证书使用。

查看当前生效配置

cat /sk_elk/softwares/es9/elasticsearch-9.4.0/config/elasticsearch.yml | grep -Ev "^#|^$"

基础配置

集群名称:同一集群所有节点必须一致,用于互相发现

cluster.name: sk_es9.4

数据文件存储路径

path.data: /sk_elk/data/es9

日志文件存储路径

path.logs: /sk_elk/logs/es9

网络绑定地址:0.0.0.0 允许任意 IP 访问;生产建议改为具体内网 IP,如 172.21.33.186

network.host: 0.0.0.0

种子主机列表:启动时用于发现集群其他节点,单点部署填本机 IP

discovery.seed_hosts: "172.21.33.186"

初始主节点列表:集群首次启动时从中选举主节点,单点部署填本机 IP

cluster.initial_master_nodes: "172.21.33.186"

启动时不加载 libcuvs_c.so 等 GPU 相关库

vectors.indexing.use_gpu: false

安全配置(X-Pack)

说明:原文注释描述"关闭认证/SSL",但实际取值 xpack.security.enabled 等为 true(即开启安全认证与加密)。以下按"开启安全"配置整理:访问需账号密码、走 HTTPS,并需 3.2 生成的证书。若确为内网测试且希望免认证,可将下列各项改为 false 并删除证书相关行。

开启 X-Pack 安全认证:访问需账号密码

xpack.security.enabled: true

开启 HTTP 接口的 SSL/TLS 加密(访问走 https)

xpack.security.http.ssl.enabled: true

开启节点间传输层(Transport)SSL/TLS 加密

xpack.security.transport.ssl.enabled: true

xpack.security.transport.ssl.verification_mode: certificate

xpack.security.transport.ssl.keystore.path: elastic-certificates.p12

xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

xpack.security.http.ssl.keystore.path: http.p12

3.2 生成安全证书

启用 SSL 后需先签发 CA 与节点证书。证书文件需放在 config 目录下,并把所属用户改为 sk_elk,否则启动会因读不到证书或权限不足失败。

1) 生成 CA(有效期 3650 天)

./bin/elasticsearch-certutil ca --days 3650

2) 基于 CA 签发节点证书(用于 transport 层)

./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

3) 生成 HTTP 层证书 http.p12(绑定本机 IP 与域名)

./bin/elasticsearch-certutil cert \

--ca elastic-stack-ca.p12 \

--ip 172.21.33.186,127.0.0.1 \

--dns localhost \

--name http

证书文件归属运行用户(在 config 目录下执行)

chown sk_elk:sk_elk *.p12

3.3 注册 systemd 服务

通过 systemd 托管 ES 进程,实现开机自启、异常自动重启与优雅关闭。注意服务中的 User/Group 与 ES_HOME、路径需与前文保持一致。

cat > /usr/lib/systemd/system/es9.service <<EOF

Unit

Description=Elasticsearch sk_es9

Documentation=https://www.elastic.co

After=network-online.target

Wants=network-online.target

Service

Type=simple

User=sk_elk

Group=sk_elk

Environment="ES_HOME=/sk_elk/softwares/es9/elasticsearch-9.4.0"

Environment="ES_PATH_CONF=/sk_elk/softwares/es9/elasticsearch-9.4.0/config"

WorkingDirectory=/sk_elk/softwares/es9/elasticsearch-9.4.0

ExecStart=/sk_elk/softwares/es9/elasticsearch-9.4.0/bin/elasticsearch -p /sk_elk/softwares/es9/elasticsearch-9.4.0/es9.pid --quiet

PIDFile=/sk_elk/softwares/es9/elasticsearch-9.4.0/es9.pid

资源限制

LimitNOFILE=65536

LimitNPROC=4096

LimitMEMLOCK=infinity

重启策略

Restart=on-failure

RestartSec=30s

启动超时(ES 启动可能较慢)

TimeoutStartSec=300

优雅关闭

KillSignal=SIGTERM

SendSIGKILL=no

SuccessExitStatus=143

Install

WantedBy=multi-user.target

EOF

启动并查看服务状态

systemctl daemon-reload

systemctl restart es9

systemctl status es9

3.4 设置内置账号密码并测试连通

安全认证开启后,需为内置系统账号(elastic 超级用户、kibana_system、beats_system)设置密码,再带账号密码通过 HTTPS 访问,返回集群信息 JSON 即表示部署成功。

./bin/elasticsearch-reset-password -i -u elastic

./bin/elasticsearch-reset-password -i -u kibana_system

./bin/elasticsearch-reset-password -i -u beats_system

测试连通(-k 忽略自签证书校验)

curl -k -u 用户名:'密码' https://localhost:9200

四、部署 Kibana

Kibana 提供 Web 可视化界面,连接 ES 后用于日志查询与看板展示。下面完成安装、配置、服务注册与启动。

4.1 安装并配置 kibana.yml

解压后将目录规范化命名,再修改主配置。重点:elasticsearch.hosts 指向带 https 的 ES 地址,username/password 使用上一步设置的 kibana_system 账号,并将 SSL 校验模式设为 none 以适配自签证书。

tar -xzf kibana-9.4.0-linux-x86_64.tar.gz

mv kibana-9.4.0-linux-x86_64 kibana9

kibana.yml 关键配置

server.port: 5601

server.host: "0.0.0.0"

server.publicBaseUrl: "http://172.21.33.186:5601"

server.name: "kibana_sk_es9"

elasticsearch.hosts: "https://localhost:9200"

elasticsearch.username: "kibana_system"

elasticsearch.password: "SuKun1234%^&*"

elasticsearch.requestTimeout: 60000

elasticsearch.ssl.verificationMode: none

logging.root.level: info

logging.appenders.default:

type: rolling-file

fileName: /sk_elk/logs/kibana9/kibana.log

policy:

type: size-limit

size: 256mb

strategy:

type: numeric

max: 10

layout:

type: json

path.data: /sk_elk/data/kibana9

i18n.locale: "zh-CN"

xpack.encryptedSavedObjects.encryptionKey: e7846ed9a1c97603af0e6d3e8e1d7a0b642a929e960956e177f17dbe97414d05

xpack.reporting.encryptionKey: f5774e6ecd5c12d19b3be3800a178436ed5b6d0a2e269890ebe2f08aac2f9d94

xpack.security.encryptionKey: a67a2c0102e8e78f6d64ddf176696f0f078644696e9ce804cf81731b05a36050

4.2 注册 systemd 服务并启动

将安装与数据目录归属运行用户后,用 systemd 托管 Kibana。After 依赖 es9.service,保证 ES 先于 Kibana 启动。

chown -R sk_elk:sk_elk /sk_elk/

cat > /etc/systemd/system/kibana.service <<EOF

Unit

Description=Kibana sk_kibana9

Documentation=https://www.elastic.co

After=network-online.target es9.service

Wants=network-online.target

Service

Type=simple

User=sk_elk

Group=sk_elk

Environment="KIBANA_HOME=/sk_elk/softwares/kibana9/kibana-9.4.0/"

WorkingDirectory=/sk_elk/softwares/kibana9/kibana-9.4.0

ExecStart=/sk_elk/softwares/kibana9/kibana-9.4.0/bin/kibana

Restart=on-failure

RestartSec=30s

TimeoutStartSec=300

LimitNOFILE=65536

Install

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl start kibana

systemctl enable kibana

五、部署 Filebeat

Filebeat 安装在被采集日志的主机上,负责读取系统日志与 Nginx 日志并发送到 ES。本例用 RPM 安装,配置文件为 /etc/filebeat/filebeat.yml。

5.1 安装

假设 filebeat-9.4.0-x86_64.rpm 在当前目录

rpm -ivh filebeat-9.4.0-x86_64.rpm

5.2 配置 filebeat.yml

配置分四段:全局处理器(附加主机元数据)、输入(采集哪些日志文件、附加用于区分索引的字段)、输出(写入哪个 ES、按字段路由到不同索引)、日志级别。output 的账号密码需与 ES 中创建的用户一致,ssl.verification_mode 设为 none 以适配自签证书。

================= 全局处理器 =================

processors:

  • add_host_metadata:

netinfo.enabled: true

matchers:

  • ip:

private: true

public: false

================= 输入配置 =================

filebeat.inputs:

1. 系统日志采集

  • type: filestream

id: system-logs

enabled: true

paths:

  • /var/log/syslog

  • /var/log/messages

  • /var/log/auth.log

  • /var/log/secure

fields:

log_type: system

environment: production

fields_under_root: true

exclude_files: ".gz$"

2. Nginx 访问日志采集

  • type: filestream

id: nginx-access-logs

enabled: true

paths:

  • /var/log/nginx/access.log*

fields:

log_type: nginx_access

fields_under_root: true

3. Nginx 错误日志采集

  • type: filestream

id: nginx-error-logs

enabled: true

paths:

  • /var/log/nginx/error.log*

fields:

log_type: nginx_error

fields_under_root: true

parsers:

  • multiline:

type: pattern

pattern: '^\\d{4}/\\d{2}/\\d{2}'

negate: true

match: after

================= 输出配置 =================

output.elasticsearch:

hosts: "https://172.21.33.186:9200"

username: "elastic"

password: "SuKun1234%^&*"

ssl.verification_mode: none

indices:

  • index: "ops-system-%{+yyyy.MM.dd}"

when.equals:

log_type: "system"

  • index: "ops-nginx-%{+yyyy.MM.dd}"

when.contains:

log_type: "nginx"

================= 日志级别 =================

logging.level: warning

5.3 启动并设置开机自启

systemctl start filebeat

systemctl enable filebeat

六、部署验证与常见问题

6.1 部署验证

按以下顺序逐项确认,全部通过即代表整套 ELK 平台部署成功:

1) ES 服务正常且集群健康(green/yellow)

systemctl status es9

curl -k -u elastic:'密码' "https://localhost:9200/_cluster/health?pretty"

2) Kibana 服务运行

systemctl status kibana

3) Filebeat 服务运行

systemctl status filebeat

4) 确认索引已写入(按日期生成)

curl -k -u elastic:'密码' "https://localhost:9200/_cat/indices?v"

浏览器访问 Kibana:http://172.21.33.186:5601 ,使用 elastic 账号登录后,可在 Stack Management → Data Views 中按 ops-system-* 或 ops-nginx-* 创建数据视图进行查询。

6.2 常见问题

1)max virtual memory areas vm.max_map_count 报错:未执行 2.1,执行 sysctl -p 并确认 vm.max_map_count 已生效。

2)too many open files:limits 未生效,确认 /etc/security/limits.d/es9.conf 已创建且服务以新会话重启。

3)Transport SSL must be enabled if security is enabled:安全开启但未开启 transport SSL,核对 elasticsearch.yml 中 xpack.security.transport.ssl.enabled 是否为 true 且证书路径正确。

4)Kibana 无法连接 ES:检查 kibana.yml 中 elasticsearch.hosts 是否为 https 地址、kibana_system 密码是否正确、elasticsearch.ssl.verificationMode 是否为 none。

5)Filebeat 报 x509 证书错误:将 output.elasticsearch.ssl.verification_mode 设为 none(或正确配置受信任 CA)。

6)权限被拒绝 / Access denied:ES 不能以 root 运行,确认服务 User=sk_elk 且 /sk_elk 目录归属 sk_elk:sk_elk。

相关推荐
骑着蜗牛撵大象3278 天前
微信远程指挥电脑:用Hermes Agent构建本地AI执行引擎实战指南
机器人·自动化·es
骑着蜗牛撵大象3278 天前
从跨平台Linux到鸿蒙PC:基于Qt C++的Flameshot截图工具源码级适配
harmonyos·鸿蒙·es
佛祖让我来巡山20 天前
从零搭建ELK日志采集系统:Filebeat + Logstash + ES + Kibana 保姆级教程
kibana·es·logstash·filebeat·日志采集
吴声子夜歌1 个月前
Java面试——ElasticSearch原理及应用
java·面试·es
vHelios1 个月前
【电商项目】商品搜索开发复盘(1):根据需求拆解搜索接口的设计逻辑
java·微服务·es
cfm_29142 个月前
Logstash 8.x 入门实战
安全·es
倒流时光三十年2 个月前
第五阶段 40 · 深分页与性能(from/size、search_after、scroll、PIT)
es
倒流时光三十年2 个月前
第三阶段 29 · suggester 自动补全(搜索框联想 / 拼写纠错)
es
倒流时光三十年2 个月前
第三阶段 24 · filter / filters 桶聚合
es