Ubuntu20.04.6 离线安装 ELK 8.19.18 完整操作文档

下载地址:

https://www.elastic.co/downloads/past-releases#elasticsearch

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.18-amd64.deb

https://artifacts.elastic.co/downloads/kibana/kibana-8.19.18-amd64.deb

https://artifacts.elastic.co/downloads/logstash/logstash-8.19.18-amd64.deb

一、Elasticsearch安装

    1、导入镜像包

    # 进入目录

    cd /opt/software

    # 导入(装载)tar镜像

    docker load -i elasticsearch-docker-8.19.18.tar

    # 查看导入后的镜像名称

    docker images | grep elasticsearch

    2、创建持久化数据目录

    mkdir -p /opt/elasticsearch/{data,logs,config,plugins}

    # ES容器内部运行用户uid=1000,必须授权,否则权限拒绝无法写入

    chmod -R 777 /opt/elasticsearch

    # 严谨生产权限(可选,替代上面777)

    sudo chown -R 1000:1000 /opt/elasticsearch

    3、修改宿主机内核参数

    # 追加配置到 sysctl.conf

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

    # 使配置立即生效

    sysctl -p

    #查看文件是否写入

    cat /etc/sysctl.conf

    4、准备 elasticsearch.yml

    若不需要密码,把绿色标记的安全认证那几行删除即可

    cat > /opt/elasticsearch/config/elasticsearch.yml <<EOF

    # 集群名称

    cluster.name: docker-cluster

    # 节点名称

    node.name: es-node-1

    # 允许外部网络访问

    network.host: 0.0.0.0

    # 单节点模式

    discovery.type: single-node

    # 开启跨域,方便 Kibana 或前端可视化工具连接

    http.cors.enabled: true

    http.cors.allow-origin: "*"

    # 自动创建索引

    action.auto_create_index: true

    # 开启安全认证

    xpack.security.enabled: true

    # 关闭HTTP层SSL(内网测试,不用https)

    xpack.security.http.ssl.enabled: false

    # 节点间通信SSL不开心

    xpack.security.transport.ssl.enabled: false

    EOF

    设置密码:

    未设置密码

    5、Docker run 启动命令

    若不需要密码,把Password删除掉,把绿色的四行都更改为false即可

    docker run -d \

    --name es-node \

    --restart always \

    --ulimit memlock=-1:-1 \

    --ulimit nofile=65535:65535 \

    -p 9200:9200 \

    -p 9300:9300 \

    -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \

    -v /opt/elasticsearch/logs:/usr/share/elasticsearch/logs \

    -v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \

    -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \

    -e "discovery.type=single-node" \

    -e "ELASTIC_PASSWORD=asdf@1234" \

    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \

    -e "xpack.security.enabled=true" \

    -e "xpack.security.enrollment.enabled=false" \

    -e "xpack.security.http.ssl.enabled=false" \

    -e "xpack.security.transport.ssl.enabled=false" \

    docker.elastic.co/elasticsearch/elasticsearch:8.19.18 \

    参数逐项解释

    1. --ulimit memlock=-1:-1 关闭 swap 内存锁定,非常关键,高写入必加
    2. --ulimit nofile 调高文件句柄,海量分片避免打开文件超限
    3. -p 9200:9200 HTTP 接口,业务、kibana、logstash 访问
    4. -p 9300:9300 集群内部通信端口,单机测试保留即可
    5. ES_JAVA_OPTS=-Xms512m -Xmx512m

    堆内存设置规则:最大不超过 31G,Xms 与 Xmx 保持相同;根据服务器内存修改

    例:服务器 64G 内存 → 设置 30g;  32G 内存设置 15g

    1. xpack.security.enabled=false 关闭账号密码、SSL,内网调试首选
    2. discovery.type=single-node 单机模式,不组建集群
    3. 用户名为:elastic        密码为:asdf@1234

    6、常用检查命令

    # 查看容器启动日志

    docker logs -f es-node

    未设置密码启动

    设置密码启动

    # 验证ES是否正常响应

     http://192.168.150.99:9200

    若后续忘记了密码,无需重新创建容器,可以直接进入容器使用官方工具重置:

    # 进入容器

    docker exec -it es-node bash

    # 重置 elastic 用户的密码(交互式输入新密码)

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

    # 也可以直接进入容器执行修改密码

    docker exec -it es-node /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i

    二、kibana安装

    1、加载本地 Kibana 镜像

    # 导入tar镜像包

    docker load -i /opt/software/kibana-docker-8.19.18.tar

    # 确认镜像名称

    docker images | grep kibana

    # 正常镜像名称:docker.elastic.co/kibana/kibana:8.19.18

    2、创建宿主机目录并配置权限

    # 创建 Kibana 的配置和数据目录

    mkdir -p /opt/kibana/{config,data}

    # 设置目录权限(Kibana 容器内默认用户 UID 通常为 1000)

    chown -R 1000:1000 /opt/kibana

    3、生成kibana.yml 配置文件

    若elasticsearch配置了密码,则kibana也要配置es的密码(在配置文件中增添绿色配置),用户名不能使用elastic,新版本 Kibana 强校验,禁止用 elastic 超级用户作为后台连接账号。可以为kibana单独生成一个用户名“kibana_system”和密码。密码生成在下面有说明

    cat > /opt/kibana/config/kibana.yml <<EOF

    # 允许外部网络访问

    server.host: "0.0.0.0"

    server.port: 5601

    # ES访问地址,容器内使用宿主机IP

    elasticsearch.hosts: ["http://192.168.150.99:9200"]

    #设置es用户名及密码

    elasticsearch.username: "kibana_system"

    elasticsearch.password: "asdf@1234"

    elasticsearch.ssl.verificationMode: none

    # 中文界面

    i18n.locale: "zh-CN"

    EOF

    无密码配置

    设置密码

    4、启动 Kibana 容器

    若es配置了密码,kibana也必须配置密码,上面是在kibana.yml配置了密码,也可以直接在配置文件中删除用户名和密码这两行配置(elasticsearch.username: "kibana_system"   elasticsearch.password: "asdf@1234"),直接在启动命令中加入绿色的配置。

    docker run -d \

      --name kibana \

      --restart=always \

      -p 5601:5601 \

      -e "NODE_OPTIONS=--max-old-space-size=512" \

      -e "ELASTICSEARCH_HOSTS=http://192.168.150.99:9200" \

    -e "ELASTICSEARCH_USERNAME=kibana_system" \

      -e "ELASTICSEARCH_PASSWORD=asdf@1234" \

      -v /opt/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \

      -v /opt/kibana/data:/usr/share/kibana/data \

      docker.elastic.co/kibana/kibana:8.19.18 \

    参数解释

    1. -p 5601:5601:web 访问端口,浏览器访问 http://服务器IP:5601
    2. -v 单独映射yml:和 ES 方案一致,避免覆盖容器内整套配置文件
    3. /opt/kibana/data:持久化 Kibana 空间、仪表板、索引模式配置
    4. NODE_OPTIONS:限制 Kibana 内存,测试环境 1G 足够;多人使用可调整为 2048

    若为kibana_system账号设置密码,可以在执行下面命令。(asdf@1234)

    docker exec -it es-node /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -i

    5、验证 Kibana 是否启动成功

    docker logs -f kibana

    6、访问

    浏览器打开:http://192.168.150.99:5601

    设置密码后,登录使用elastic账号,不能使用kibana_system账号,否则提示无权限。

    7、生成加密密钥并写入 kibana.yml(可忽略)

    此时,虽然启动成功,但会报错

     Error: Unable to create alerts client because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command.

    Kibana 8.x 强制要求 加密密钥,用于存储告警、监视任务等加密持久化数据

    执行如下命令:

    docker exec -it kibana /usr/share/kibana/bin/kibana-encryption-keys generate

    执行后,终端会输出类似如下的三行配置(每次生成的密钥都是随机字符串)

    xpack.encryptedSavedObjects.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    xpack.security.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    xpack.reporting.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    将密钥写入宿主机配置文件(修改宿主机 /opt/kibana/config/kibana.yml,追加上面三行)

    xpack.encryptedSavedObjects.encryptionKey: 21f66c17919bc1cea62f82043324649f0351af4f2795294f2924e831eebbd8a2

    xpack.reporting.encryptionKey: ac5943bdbc2ef64c7b3ccbb43ceefa9597e019de0f59f9413ccd7d5ea54a864a

    xpack.security.encryptionKey: d1df7dc948041fcd4c9165220a6cf11eb2f167281ff6d0ee7427e44f2d809351

    重启 Kibana 容器

    保存配置文件后,重启 Kibana 使配置生效:

    docker restart kibana

    日志里已经打印关键一行:

    [2026-08-14T09:51:16.831+00:00][INFO ][status] Kibana is now available

    三、logstash安装

    1、加载 Logstash 离线镜像

    docker load -i /opt/software/logstash-docker-8.19.18.tar

    2、创建宿主机目录并赋权

    mkdir -p /opt/logstash/{config,pipeline,data}

    # 赋予读写权限,避免容器内权限不足

    chmod -R 777 /opt/logstash

    3、创建 logstash.yml 主配置

    cat > /opt/logstash/config/logstash.yml <<EOF

    http.host: "0.0.0.0"

    xpack.monitoring.elasticsearch.hosts: ["http://192.168.150.99:9200"]

    xpack.monitoring.elasticsearch.username: "elastic"

    xpack.monitoring.elasticsearch.password: "asdf@1234"

    EOF

    4、创建管道配置文件 (logstash.conf)

    cat > /opt/logstash/pipeline/logstash.conf <<EOF

    input {

      beats {

        port => 5044

      }

    }

    filter {

    }

    output {

      elasticsearch {

        hosts => ["http://192.168.150.99:9200"]

        user => "elastic"

        password => "asdf@1234"

        index => "logstash-test-%{+YYYY.MM.dd}"

      }

      stdout { codec => rubydebug }

    }

    EOF

    5、启动 Logstash

    docker run -d \

      --name logstash \

      --restart=always \

      -p 5044:5044 \

      -p 9600:9600 \

      -v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \

      -v /opt/logstash/pipeline:/usr/share/logstash/pipeline \

      -v /opt/logstash/data:/usr/share/logstash/data \

      -e LS_JAVA_OPTS="-Xms512m -Xmx512m" \

      docker.elastic.co/logstash/logstash:8.19.18 \

    # 实时日志

    docker logs -f logstash

    6、验证

    访问:http://192.168.150.99:9600/_node/pipelines

    四、安装分词器

    1、将分词器压缩包复制到 ES 容器中(容器名为 es-node)

    docker cp /opt/software/elasticsearch-analysis-ik-8.19.18.zip es-node:/tmp/

    2、进入容器并安装插件

    docker exec -it es-node bash

    3、安装插件(看到 -> Installed analysis-ik 字样,说明安装成功)

    bin/elasticsearch-plugin install -b file:///tmp/elasticsearch-analysis-ik-8.19.18.zip

    4、验证插件(输出 analysis-ik 即正常)

    /usr/share/elasticsearch/bin/elasticsearch-plugin list

    5、退出容器并重启 ES 服务,并重新启动es

    exit

    cd /opt/elk-compose

    #重新启动es

    docker compose restart es-node

    #查看日期

    docker compose logs -f elasticsearch

    6、测试分词器

    curl -k -u 'elastic:asdf@1234' -X POST "http://192.168.150.99:9200/_analyze" -H "Content-Type: application/json" -d '{

      "analyzer": "ik_max_word",

      "text": "软件研发工程师 Elasticsearch中文分词测试"

    }'

    五、ELK验证

    场景一:直接向 ES 写入数据并查看

    写入数据到ES

    curl -X POST "http://192.168.150.99:9200/test-logs/_doc" \

    -H "Content-Type: application/json" \

    -u elastic:asdf@1234 \

    -d '{

      "message": "这是一条直接写入ES的测试日志",

      "level": "INFO",

      "app": "my-test-app",

      "@timestamp": "2026-08-15T16:50:00.000Z"

    }'

    在 Kibana 界面中查看

    1. 浏览器打开 http://192.168.150.99:5601,使用 elastic / asdf@1234 登录。
    2. 在左侧导航栏点击 Stack Management(堆栈管理)。
    3. 在左侧菜单找到 Kibana -> Data Views(旧版本叫 Index Patterns / 索引模式)。
    4. 点击右上角 Create data view(创建数据视图)。
    5. Name 填写:test-logs-view。
    6. Index pattern 填写:test-logs*(注意带星号,表示匹配所有以 test-logs 开头的索引)。
    7. Timestamp field 选择:@timestamp,然后点击 Save data view to Kibana
    8. 创建成功后,点击左侧导航栏的 Discover(发现),您就能在左侧看到刚刚创建的视图,右侧会直接展示您写入的那条 JSON 数据!

    场景二:监听宿主机日志文件写入 ES 并查看

    1. 准备一个测试日志文件
    在宿主机上创建一个测试日志文件,并写入几行模拟日志:

    mkdir -p /opt/test-logs

    cat > /opt/test-logs/app-test.log <<EOF

    2026-08-15 16:50:01 INFO  用户登录成功 user_id=1001

    2026-08-15 16:50:02 ERROR 数据库连接超时 timeout=3000ms

    2026-08-15 16:50:03 WARN  内存使用率过高 usage=85%

    EOF

    2. 新建Logstash配置以监听该文件

    cat > /opt/logstash/pipeline/file-test-logs.conf <<EOF

    input {

      file {

        path => "/var/log/app-logs/app-test.log"

        start_position => "beginning"  # 每次重启从头读取(仅测试用)

        sincedb_path => "/dev/null"   

        type => "test-app-log"         # 添加一个自定义类型,方便在 ES 中区分

      }

    }

    filter {

      # 可以在这里添加 grok 等解析规则

    }

    output {

      elasticsearch {

        hosts => ["http://192.168.150.99:9200"]

        user => "elastic"

        password => "asdf@1234"

        index => "app-file-logs-%{+YYYY.MM.dd}"

      }

      stdout { codec => rubydebug }

    }

    EOF

    3、重启 Logstash 并挂载日志目录

    # 先停掉旧的logstash

    docker stop logstash && docker rm -v logstash

    #启动

    docker run -d \

      --name logstash \

      --restart=always \

      -p 5044:5044 \

      -p 9600:9600 \

      -v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \

      -v /opt/logstash/pipeline:/usr/share/logstash/pipeline \

      -v /opt/logstash/data:/usr/share/logstash/data \

      -v /opt/test-logs:/var/log/app-logs:ro \

      -e LS_JAVA_OPTS="-Xms512m -Xmx512m" \

      docker.elastic.co/logstash/logstash:8.19.18 \

    # 实时日志 (如果看到打印出写入的三行日志,说明采集成功。)

    docker logs -f logstash

    持续追加日志测试:

    echo "2026-08-15 18:02:00 INFO 定时任务执行成功" >> /opt/test-logs/app-test.log

     4、在 Kibana 中查看文件日志

    1. Kibana 的 Stack Management -> Data Views
    2. 创建一个新的 Data View:
      • Name: app-file-logs-view
      • Index pattern: app-file-logs*
      • Timestamp field: @timestamp
    3. 保存后进入 Discover,切换到这个新的 Data View,您就能看到 Logstash 从文件中采集到的三条日志了。

    在数据视图中选择刚才创建的视图(app-file-logs-view)

    更多推荐