ELK 9.2.0 安装部署手册
📋 目录
-
- 环境准备
-
- 系统优化
-
- 安装部署
-
3.1 安装 Elasticsearch
-
3.2 安装 Kibana
-
3.3 安装 Logstash
-
- 项目工程集成
-
- 数据清理策略
1. 环境准备
🖥️ 系统信息
-
操作系统 :
CentOS Linux release 7.9.2009 (Core) -
服务器IP :
10.28.21.213 -
安装目录 :
/opt/elk
📦 安装包下载
| 组件 | 下载地址 |
|---|---|
| Elasticsearch | elasticsearch-9.2.0-x86_64.rpm |
| Kibana | kibana-9.2.0-x86_64.rpm |
| Logstash | logstash-9.2.0-x86_64.rpm |
bash
mkdir -p /opt/elk
cd /opt/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.2.0-x86_64.rpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-9.2.0-x86_64.rpm
wget https://artifacts.elastic.co/downloads/logstash/logstash-9.2.0-x86_64.rpm
💡 提示 : 提前将安装包下载至
/opt/elk目录
2. 系统优化
🔧 资源限制配置
bash
vim /etc/security/limits.conf
添加以下内容:
bash
# 进程可以最大打开的文件数
* soft nofile 655350
* hard nofile 655350
# 进程可以创建的线程数
* soft nproc 102400
* hard nproc 409600
# 允许进程锁定内存
* soft memlock unlimited
* hard memlock unlimited
参数说明:
-
soft: 警告阈值
-
hard: 强制限制阈值
-
nofile: 文件描述符数量限制
-
nproc: 进程数量限制
-
memlock: 内存锁定限制
🖥️ 系统内核参数
bash
vim /etc/sysctl.conf
添加以下内容:
bash
vm.max_map_count = 262145
fs.file-max = 655360
立即生效:
bash
sysctl -p
参数说明:
-
max_map_count: 进程可拥有的虚拟内存区域数量 -
file-max: 系统可同时打开的文件数量
🔥 防火墙配置
bash
# 禁用并关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
⚠️ 注意: 生产环境建议开启指定端口而非完全关闭防火墙
3. 安装部署
3.1 安装 Elasticsearch
📥 安装命令
bash
rpm -ivh /opt/elk/elasticsearch-9.2.0-x86_64.rpm
🔐 SSL 证书签发
bash
/usr/share/elasticsearch/bin/elasticsearch-certutil cert \
--name http \
--ip 10.28.21.213,127.0.0.1 \
--dns localhost,SHS-A-BASIC03 \
--out /etc/elasticsearch/ssl.zip \
--pem \
--self-signed \
--silent
参数详解:
| 参数 | 说明 |
|---|---|
--name http |
证书名称,用于 HTTP 服务 |
--ip |
绑定的 IP 地址列表 |
--dns |
绑定的主机名列表 |
--out |
证书输出路径 |
--pem |
输出 PEM 格式证书 |
--self-signed |
生成自签名证书 |
--silent |
静默模式,无交互提示 |
📁 证书部署
bash
cd /etc/elasticsearch
mkdir -p /etc/elasticsearch/ssl
unzip -j /etc/elasticsearch/ssl.zip -d /etc/elasticsearch/ssl/
chown -R elasticsearch:elasticsearch ssl
chmod 600 ssl/*
⚙️ Elasticsearch 配置
yml
tee /etc/elasticsearch/elasticsearch.yml << \EOF
# ================= Elasticsearch 基本配置 =================
# 集群名称,单节点也需要设置
cluster.name: "es-single-node"
# 节点名称,可自定义
node.name: "es"
# 节点角色,单节点通常同时承担 master、data、ingest
node.roles: ["master", "data", "ingest"]
# 单节点模式,避免选主冲突
discovery.type: single-node
# ======================== 数据与日志 =======================
# 数据存储路径
path.data: /var/lib/elasticsearch
# 日志目录
path.logs: /var/log/elasticsearch
# ======================== 安全与 SSL ======================
# 启用安全功能(用户认证、TLS/SSL 等)
xpack.security.enabled: true
# 启用 HTTP 层 TLS/SSL
xpack.security.http.ssl.enabled: true
# HTTP 层私钥
xpack.security.http.ssl.key: /etc/elasticsearch/ssl/http.key
# HTTP 层证书
xpack.security.http.ssl.certificate: /etc/elasticsearch/ssl/http.crt
# 启用 Transport 层 TLS/SSL(节点间通信,如果是单节点,可暂时关闭)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
# 单节点,可使用自签证书
xpack.security.transport.ssl.key: /etc/elasticsearch/ssl/http.key
xpack.security.transport.ssl.certificate: /etc/elasticsearch/ssl/http.crt
# ======================== 索引管理 ========================
# 索引生命周期管理(ILM)轮询周期
indices.lifecycle.poll_interval: 5m
# ======================== 机器学习 ========================
# 禁用 ML 功能,减少资源消耗
xpack.ml.enabled: false
# ======================== 网络设置 ========================
# Elasticsearch 绑定的 IP,可以访问的地址
network.host: 0.0.0.0
# HTTP 服务端口
http.port: 9200
EOF
⚠️ 重要: 由于 CentOS 7.9 的 GLIBC 版本过低限制,必须禁用机器学习模块
🚀 启动服务
bash
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
🔑 密码配置
bash
# 修改 elastic 用户密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
# 修改 kibana_system 用户密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -i
# 修改 logstash_system 用户密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u logstash_system -i
密码要求:
-
至少 8 个字符
-
包含大写字母、小写字母、数字
-
可包含特殊字符
✅ 验证安装
bash
curl -u elastic:elastic账号的密码 -k https://10.28.21.213:9200
3.2 安装 Kibana
📥 安装命令
bash
rpm -ivh /opt/elk/kibana-9.2.0-x86_64.rpm
🔐 证书配置
bash
mkdir -p /etc/kibana/ssl
cp /etc/elasticsearch/ssl/http.crt /etc/kibana/ssl/http.crt
chown -R kibana:kibana /etc/kibana/ssl
chmod 600 /etc/kibana/ssl/*
⚙️ Kibana 配置
yml
tee /etc/kibana/kibana.yml << \EOF
# ======================== 基础服务配置 ========================
# 绑定的主机地址,0.0.0.0 表示所有网卡都可访问
server.host: "0.0.0.0"
# Kibana Web 服务端口
server.port: 5601
# 服务器名称:用于HTTP响应头和日志标识(建议填写主机名或域名)
server.name: "kibana"
# ======================== 国际化与界面优化 =====================
# 界面语言:中文(无需引号)
i18n.locale: zh-CN
# ======================== Elasticsearch 连接配置 ==============
# ES地址:多节点用逗号分隔(如 ["https://es-01:9200", "https://es-02:9200"])
elasticsearch.hosts: ["https://localhost:9200"]
# es账号:使用内置 kibana_system 账号(最小权限原则)
elasticsearch.username: "kibana_system"
# es密码
elasticsearch.password: "kibana_system账号的密码"
# ES 连接超时:延长至 60s(适配大查询/慢响应场景)
elasticsearch.requestTimeout: 60000
# 最大并发连接:从 1024 下调至 512(避免占用过多系统资源)
elasticsearch.maxSockets: 512
# HTTP 压缩:保持开启(减少网络传输量)
elasticsearch.compression: true
# 证书权威机构指定 ES 证书
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/ssl/http.crt"]
# SSL 验证模式:生产环境强制 full(验证证书有效性+主机名匹配,防止中间人攻击)
# full:完全验证证书及主机名
# none:不验证证书
# certificate:只验证证书,不验证主机名
elasticsearch.ssl.verificationMode: full
# ======================== 日志配置 ===========================
logging:
appenders:
# 将日志输出到文件
file:
type: file
fileName: /var/log/kibana/kibana.log # 日志文件路径
layout:
type: json # JSON 格式,便于 ELK 采集
root:
appenders:
- default # 控制台日志
- file # 文件日志
# ======================== 生产环境增强配置 =====================
# PID文件:默认路径
pid.file: /run/kibana/kibana.pid
EOF
🚀 启动服务
bash
systemctl daemon-reload
systemctl enable kibana
systemctl start kibana
🌐 访问测试
访问地址: http://10.28.21.213:5601/
3.3 安装 Logstash
📥 安装命令
bash
rpm -ivh /opt/elk/logstash-9.2.0-x86_64.rpm
🔐 证书配置
bash
mkdir -p /etc/logstash/ssl
cp /etc/elasticsearch/ssl/http.crt /etc/logstash/ssl/http.crt
chown -R logstash:logstash /etc/logstash/ssl
chmod 600 /etc/logstash/ssl/*
⚙️ Logstash 配置
bash
tee /etc/logstash/logstash.yml << \EOF
# ================= 基础路径设置 =================
# 数据存放目录
path.data: /var/lib/logstash
# 日志存放目录
path.logs: /var/log/logstash
# ================= Pipeline 配置 ===============
# 开启配置文件动态重载(当 pipeline 配置文件修改时自动生效)
config.reload.automatic: true
# 检查配置文件更新的间隔时间
config.reload.interval: 3s
# ================= Elasticsearch 输出与安全 =====
# 是否启用 X-Pack 监控
xpack.monitoring.enabled: true
# 监控数据发送到的 Elasticsearch 主机(HTTPS 协议)
xpack.monitoring.elasticsearch.hosts: ["https://localhost:9200"]
# 如果 Elasticsearch 配置了用户名和密码,请填入
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "logstash_system账号的密码"
# 如果 Elasticsearch 使用自签名证书,需要指定 CA 证书路径(PEM 格式)
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/etc/logstash/ssl/http.crt"
# 如果只是测试环境、不验证 SSL 证书,可以使用下面这一行(生产环境不推荐)
# xpack.monitoring.elasticsearch.ssl.verification_mode: none
# ================= 其他常用配置 ==================
# Logstash pipeline 配置文件路径(只会加载指定目录下的 .conf 文件)
path.config: /etc/logstash/conf.d/*.conf
# HTTP API 绑定地址,默认只允许本地访问,0.0.0.0 表示允许所有网卡访问
api.enabled: true
api.http.host: "0.0.0.0"
api.http.port: 9600
EOF
🔄 Pipeline 配置
bash
tee /etc/logstash/conf.d/default.conf << \EOF
# ================= 输入插件 ===============
input {
tcp {
mode => "server" # 以 TCP 服务器模式监听客户端日志
host => "0.0.0.0" # 监听所有网卡
port => 4567 # 监听端口
codec => json_lines # 每行 JSON 为一条日志
}
}
# ================= 过滤器 =================
filter {
# 将日志中的 timestamp 字段解析为 Logstash 内置的 @timestamp
date {
match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"] # 指定时间格式
target => "@timestamp" # 转换后存入 @timestamp
# timezone => "Asia/Shanghai" # 可根据实际时区设置
}
# 如果日志中没有 app 字段,默认添加一个
if ![app] {
mutate {
add_field => { "app" => "log" }
}
}
# 将 app 字段格式化为索引名使用的简写
mutate {
# gsub 正则说明:
# [^a-zA-Z0-9_-] → 匹配所有非字母、非数字、非下划线、非中划线的字符
# 替换成 "-",保证生成的索引名合法
gsub => ["app", "[^a-zA-Z0-9_-]", "-"]
}
}
# ================= 输出插件 =================
output {
elasticsearch {
hosts => ["https://localhost:9200"] # Elasticsearch 地址,HTTPS 协议
user => "elastic" # 用户名
password => "elastic账号的密码" # 密码
ssl_enabled => true # 启用 SSL
ssl_certificate_authorities => "/etc/logstash/ssl/http.crt" # 自签名证书路径
# 如果日志不完全符合 ECS 规范,禁用 ECS 兼容模式
ecs_compatibility => disabled
# 动态索引名,根据 app 字段生成
# 例如 app=sz-yplus-gateway → 索引名:sz-yplus-gateway-2025.10.14
index => "%{[app]}-%{+YYYY.MM.dd}"
codec => json # 输出 JSON 格式
action => "index" # 索引操作类型
}
}
EOF
🚀 启动服务
bash
systemctl daemon-reload
systemctl enable logstash
systemctl start logstash
4. 项目工程集成
📚 Maven 依赖
xml
<!-- ELK Logstash 日志收集 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
⚙️ Logback 配置
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 配置属性 -->
<!-- LOG_DIR: 日志目录路径,默认为当前目录下的logs文件夹 -->
<property name="LOG_DIR" value="${LOG_PATH:-./logs}"/>
<!-- MAX_HISTORY: 日志文件最大保留历史数量,默认为15天 -->
<property name="MAX_HISTORY" value="7"/>
<!-- PATTERN_SCRIPT: 日志打印格式,包含时间、线程、级别、类、方法、行号、消息等信息 -->
<property name="PATTERN_SCRIPT" value="%date{yyyy/MM/dd HH:mm:ss.SSS} [%thread] [%-5level] [%c{24}.%M\(\) : %line] - %msg%n"/>
<!-- API_PATTERN_SCRIPT: API日志打印格式,仅包含时间、消息 -->
<property name="API_PATTERN_SCRIPT" value="%date{yyyy/MM/dd HH:mm:ss.SSS} # %msg%n"/>
<!-- LOGSTASH_ADDRESS: Logstash的地址和端口,用于日志收集 -->
<property name="LOGSTASH_ADDRESS" value="${LOGSTASH:-10.28.19.168:5042}"/>
<!-- 根据Spring配置文件中的profile设置不同的属性值 -->
<springProfile name="dev,test,test1,test2,test3">
<property name="ENV" value="test"/>
</springProfile>
<springProfile name="uat,pre,sim">
<property name="ENV" value="uat"/>
</springProfile>
<springProfile name="pro,prd">
<property name="ENV" value="prd"/>
</springProfile>
<!-- 根据ENV属性设置应用名称 -->
<property name="APP" value="from-bamboo"/>
<!-- 控制台日志输出配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN_SCRIPT}</pattern>
</encoder>
</appender>
<!-- 滚动文件日志输出配置,按天滚动 -->
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${APP}.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留天数 -->
<maxHistory>${MAX_HISTORY}</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>${PATTERN_SCRIPT}</pattern>
</encoder>
</appender>
<!-- Logstash日志输出配置,用于将日志发送到Logstash -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>${LOGSTASH_ADDRESS}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<!--自定义字段,区分应用名称及节点名称-->
<customFields>
{
"app":"${APP}",
"env":"${ENV}",
"hostname":"${HOSTNAME}"
}
</customFields>
</encoder>
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 异步日志输出配置,用于提高日志输出性能 -->
<appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT"/>
<!-- 设置队列入队时非阻塞,当队列满时会直接丢弃日志,但是对性能提升极大 -->
<neverBlock>true</neverBlock>
<!-- 新增这行为了打印栈堆信息 -->
<includeCallerData>true</includeCallerData>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC_ROLLING_FILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ROLLING_FILE"/>
<!-- 设置队列入队时非阻塞,当队列满时会直接丢弃日志,但是对性能提升极大 -->
<neverBlock>true</neverBlock>
<!-- 新增这行为了打印栈堆信息 -->
<includeCallerData>true</includeCallerData>
</appender>
<!-- 异步Logstash日志输出配置 -->
<appender name="ASYNC_LOGSTASH" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="LOGSTASH"/>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<!-- 根据不同的环境设置日志级别-本地环境和开发环境输出DEBUG级别日志-->
<springProfile name="dev,test,test1,test2,test3,sim,pre">
<!-- print request url & parameter -->
<logger name="org.springframework.web.method.support.InvocableHandlerMethod" level="DEBUG"/>
<logger name="org.springframework.boot.SpringApplication" level="TRACE"/>
<!-- print transaction -->
<logger name="org.springframework.transaction.interceptor.TransactionInterceptor" level="TRACE"/>
<logger name="org.springframework.jdbc.support.JdbcTransactionManager" level="DEBUG"/>
<!-- print sql log , but for development debug -->
<logger name="com.zaxxer.hikari.HikariConfig" level="DEBUG"/>
<logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
<logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
<logger name="org.apache.ibatis.logging.jdbc.BaseJdbcLogger" level="DEBUG"/>
<logger name="org.apache.ibatis.jdbc.ScriptRunner" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
</springProfile>
<!-- 根据不同的环境设置日志级别-生产环境输出INFO级别日志 -->
<springProfile name="prd,pro">
<logger name="com.zaxxer.hikari.HikariConfig" level="DEBUG"/>
</springProfile>
<!-- 根日志配置,设置日志输出级别和对应的appender -->
<root level="WARN">
<appender-ref ref="ASYNC_STDOUT"/>
<appender-ref ref="ASYNC_ROLLING_FILE"/>
<appender-ref ref="ASYNC_LOGSTASH"/>
</root>
</configuration>
5. 数据清理策略
📅 创建生命周期策略
json
PUT _ilm/policy/delete-after-15days
{
"policy": {
"phases": {
"delete": {
"min_age": "15d",
"actions": {
"delete": {}
}
}
}
}
}
🔗 绑定索引模板
json
PUT _index_template/delete-after-15days-template
{
"index_patterns": ["from-*"],
"template": {
"settings": {
"index.lifecycle.name": "delete-after-15days",
"number_of_shards": 1,
"number_of_replicas": 0
}
}
}
📋 现有索引绑定
json
# 一次性绑定所有 "from-" 前缀索引
PUT from-*/_settings
{
"index.lifecycle.name": "delete-after-15days"
}
✅ 验证策略
json
GET from-bamboo-2025.11.13/_ilm/explain
🛠️ 其他命令
json
# 验证 ILM 服务是否运行正常
GET _ilm/status
# 索引批量解绑所有策略(针对"from-"前缀的索引)
POST from-*/_ilm/remove
# 删除策略
DELETE _ilm/policy/delete-after-15days
🎉 安装完成
至此,ELK 9.2.0 完整安装部署已完成,包括:
-
✅ Elasticsearch 搜索集群
-
✅ Kibana 可视化界面
-
✅ Logstash 数据管道
-
✅ 应用日志集成
-
✅ 自动数据清理策略
6.引用Reference
- CentOS8搭建nfs服务
- Kubernetes1.25.4版本安装
- kubeasz安装kubernetes1.25.5
- k8s一键安装redis单机版
- k8s一键安装mysql8单机版
- k8s部署springboot应用
- Docker安装及学习
- Docker制作springboot运行应用镜像
- Docker制作Java8环境镜像
- Docker安装Mysql5.7.31
- Docker安装Mysql8
- Elasticsearch单机版本安装
- Elasticsearch集群安装
- ELK 8.17.0 安装部署手册
- ELK 9.2.0 安装部署手册
- Docker安装ELK
- zookeeper集群安装
- Nginx日志切割
- RabbitMQ集群安装
- Docker安装RabbitMQ单机版
- springboot集成prometheus+grafana
- windows11安装android应用
- Windows下多个JDK版本快速切换
- MongoDB主从仲裁模式安装
- MongoDB单机版安装
- Redis集群安装
- Docker安装Nginx
- RabbitMQ单节点安装