ELK 9.2.0 安装部署手册

ELK 9.2.0 安装部署手册

📋 目录

    1. 环境准备
    1. 系统优化
    1. 安装部署
    • 3.1 安装 Elasticsearch

    • 3.2 安装 Kibana

    • 3.3 安装 Logstash

    1. 项目工程集成
    1. 数据清理策略

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

相关推荐
拾心214 天前
【云运维】ELK笔记
运维·elk
冷血~多好6 天前
使用docker部署elk,实现日志追踪
elk·docker·容器
会飞的小蛮猪7 天前
ELK运维之路(数据备份and还原)
运维·服务器·elk
The_Second_Coming7 天前
ELK 学习笔记
笔记·学习·elk
小牛马爱写博客7 天前
ELK 企业级日志分析系统部署与实践
elk·elasticsearch·kibana·logstash
ShareBeHappy_Qin7 天前
Elastic Stack 或 ELK —— 日志管理与数据分析方案
elk
一周困⁸天.9 天前
Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】
大数据·elk·elasticsearch·jenkins
yuxb739 天前
ELK企业级日志分析系统
笔记·elk
phoenix09819 天前
ELK企业级日志分析系统学习
学习·elk