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。