ELK Stack(Elasticsearch + Logstash + Kibana)环境搭建完全指南

ELK Stack(Elasticsearch + Logstash + Kibana)环境搭建完全指南

Someone Lv5

概述

ELK Stack 是业界最流行的开源日志管理解决方案,由 Elasticsearch(搜索引擎/存储引擎)、Logstash(日志采集/处理管道)和 Kibana(数据可视化面板)三个核心组件组成。它能够集中采集、存储、分析和可视化来自多台服务器的日志数据,是运维排障、安全审计、业务分析的利器。

本文以 Ubuntu 22.04 LTS 为例,手把手教你从零搭建完整的 ELK Stack 环境。

一、架构概述

ELK 工作流程

1
应用/服务日志 → Filebeat/Logstash → Elasticsearch → Kibana
  • Filebeat:轻量级日志采集器,部署在每个目标服务器上,将日志发送到 Logstash 或直接写入 Elasticsearch
  • Logstash:服务端数据处理管道,接收多种来源的日志,进行解析、过滤、转换后输出到 Elasticsearch
  • Elasticsearch:分布式搜索和分析引擎,负责日志的存储、索引和搜索
  • Kibana:Web 可视化面板,提供日志搜索、图表展示、仪表板等功能
组件版本端口描述
Elasticsearch8.x9200 (HTTP) / 9300 (Transport)分布式搜索引擎,存储与索引日志
Logstash8.x5044 (Beats) / 9600 (API)日志处理管道,采集、解析、过滤
Kibana8.x5601数据可视化与搜索面板
Filebeat8.x-轻量级日志采集器(客户端部署)

二、环境准备

系统要求

1
2
3
4
5
6
7
8
9
10
11
12
# 检查系统版本
lsb_release -a

# 更新系统包
sudo apt update && sudo apt upgrade -y

# 安装必要工具
sudo apt install -y curl wget gnupg apt-transport-https software-properties-common

# 调整系统参数(Elasticsearch 要求)
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Java 环境(Elasticsearch 8.x 内置 JDK,无需单独安装)

Elasticsearch 8.x 发行版已内置捆绑的 OpenJDK,无需额外安装 Java。如需查看内置 JDK 版本:

1
2
# 安装后查看 Elasticsearch 内置 JDK 版本
/usr/share/elasticsearch/jdk/bin/java -version

三、安装 Elasticsearch

3.1 添加 Elastic 官方源

1
2
3
4
5
6
7
8
# 导入 GPG 密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

# 添加 APT 源
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

# 更新源
sudo apt update

3.2 安装 Elasticsearch

1
2
# 安装
sudo apt install -y elasticsearch

3.3 配置 Elasticsearch

1
2
# 编辑主配置文件
sudo vi /etc/elasticsearch/elasticsearch.yml

关键配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 集群名称
cluster.name: my-elk-cluster

# 节点名称
node.name: node-1

# 数据存储路径
path.data: /var/lib/elasticsearch

# 日志路径
path.logs: /var/log/elasticsearch

# 网络绑定地址(建议绑定内网 IP)
network.host: 0.0.0.0

# HTTP 访问端口
http.port: 9200

# 启用安全特性
xpack.security.enabled: true

# 单节点发现(单机部署)
discovery.type: single-node

安全提示:生产环境请勿将 network.host 设置为 0.0.0.0 暴露到公网,应绑定内网 IP 并通过 Nginx 反向代理访问。

3.4 启动与验证

1
2
3
4
5
6
7
8
9
# 启动 Elasticsearch
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

# 检查状态
sudo systemctl status elasticsearch

# 查看启动日志
sudo journalctl -u elasticsearch -n 50

3.5 重置密码

Elasticsearch 8.x 默认启用安全特性,首次安装后会生成随机密码。推荐手动重置:

1
2
3
4
# 重置 elastic 用户密码
cd /usr/share/elasticsearch
sudo bin/elasticsearch-reset-password -u elastic -i
# 输入并确认密码(保存好,后续使用)

验证连接:

1
2
# 测试 Elasticsearch 连接
curl -k -u elastic:你的密码 https://localhost:9200

预期返回类似:

1
2
3
4
5
6
7
8
9
10
11
{
"name" : "node-1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "xxx",
"version" : {
"number" : "8.15.0",
"build_flavor" : "default",
...
},
"tagline" : "You Know, for Search"
}

四、安装 Kibana

4.1 安装

1
sudo apt install -y kibana

4.2 配置 Kibana

1
sudo vi /etc/kibana/kibana.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 服务端口
server.port: 5601

# 监听地址(建议绑定内网 IP)
server.host: "0.0.0.0"

# Elasticsearch 地址
elasticsearch.hosts: ["https://localhost:9200"]

# Elasticsearch 认证凭据
elasticsearch.username: "kibana_system"
elasticsearch.password: "你的密码"

# 启用 SSL(如未配置证书可暂时关闭验证)
elasticsearch.ssl.verificationMode: none

4.3 创建 Kibana 系统用户密码

1
2
3
4
# 重置 kibana_system 用户密码
cd /usr/share/elasticsearch
sudo bin/elasticsearch-reset-password -u kibana_system -i
# 输入并确认密码,然后更新到 kibana.yml 中

4.4 启动 Kibana

1
2
3
4
5
6
# 启动
sudo systemctl start kibana
sudo systemctl enable kibana

# 检查状态
sudo systemctl status kibana

4.5 访问 Kibana

浏览器访问 http://你的服务器IP:5601,使用 elastic 用户和之前设置的密码登录。

注意:如果 Kibana 与 Elasticsearch 不在同一台机器,需要将 elasticsearch.hosts 中的 localhost 替换为 Elasticsearch 的实际 IP。

五、安装 Logstash

5.1 安装

1
sudo apt install -y logstash

5.2 创建 Logstash 管道配置

1
2
# 创建主配置文件
sudo vi /etc/logstash/conf.d/logstash.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
input {
beats {
port => 5044
ssl => false
}
}

filter {
# 解析 Nginx 访问日志(可选)
if [fields][log_type] == "nginx-access" {
grok {
match => { "message" => "%{IPORHOST:client_ip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response} %{NUMBER:body_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
}
}

# 解析系统日志(可选)
if [fields][log_type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:syslog_message}" }
}
}

# 移除原始 message 减少存储(可选)
# mutate { remove_field => ["message"] }
}

output {
elasticsearch {
hosts => ["https://localhost:9200"]
user => "elastic"
password => "你的密码"
ssl => false
index => "logs-%{+YYYY.MM.dd}"
}
}

5.3 启动 Logstash

1
2
3
4
5
6
# 启动
sudo systemctl start logstash
sudo systemctl enable logstash

# 检查状态
sudo systemctl status logstash

六、安装 Filebeat(客户端部署)

Filebeat 需要部署在每个需要采集日志的服务器上。

6.1 安装

1
2
# 在被监控服务器上执行
sudo apt install -y filebeat

6.2 配置 Filebeat

1
sudo vi /etc/filebeat/filebeat.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/syslog
- /var/log/auth.log
fields:
log_type: syslog
fields_under_root: true

- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx-access
fields_under_root: true

output.logstash:
hosts: ["你的ELK服务器IP:5044"]

6.3 启动 Filebeat

1
2
3
4
5
6
7
8
9
# 加载 Filebeat 内置的 Elasticsearch 模板
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["你的ELK服务器IP:9200"]'

# 启动
sudo systemctl start filebeat
sudo systemctl enable filebeat

# 检查连接状态
sudo filebeat test output

七、安全加固

7.1 Nginx 反向代理 Kibana

1
2
3
4
5
# 安装 Nginx
sudo apt install -y nginx

# 创建 Kibana 反向代理配置
sudo vi /etc/nginx/sites-available/kibana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name kibana.你的域名.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name kibana.你的域名.com;

ssl_certificate /etc/letsencrypt/live/你的域名.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名.com/privkey.pem;

# 启用认证
auth_basic "Kibana Login";
auth_basic_user_file /etc/nginx/.kibana-users;

location / {
proxy_pass http://127.0.0.1:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
1
2
3
4
5
6
7
# 创建认证用户
sudo htpasswd -c /etc/nginx/.kibana-users admin

# 启用站点
sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

7.2 防火墙配置

1
2
3
4
5
6
# 只开放必要端口
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 5044/tcp # Logstash Beats 输入(内网)
sudo ufw enable

7.3 系统资源限制

Elasticsearch 对系统资源有较高要求,建议调整:

1
2
3
4
5
6
# 调整文件描述符限制
echo "elasticsearch - nofile 65535" | sudo tee /etc/security/limits.d/elasticsearch.conf

# 禁用 Swap(生产环境建议)
sudo swapoff -a
# 或在 fstab 中注释掉 swap 行

八、常用操作速查

操作命令
查看 Elasticsearch 集群健康curl -k -u elastic:密码 https://localhost:9200/_cluster/health
列出所有索引curl -k -u elastic:密码 https://localhost:9200/_cat/indices?v
删除过期索引curl -k -u elastic:密码 -X DELETE https://localhost:9200/logs-2026.06.01
查看 Logstash 管道列表sudo /usr/share/logstash/bin/logstash --list-pipelines
检查 Filebeat 注册表sudo filebeat show --state
Kibana Dev Tools 入口浏览器访问 Kibana → 左侧菜单 → Dev Tools

九、性能优化建议

9.1 Elasticsearch 调优

1
2
3
4
5
# 在 elasticsearch.yml 中添加
indices.memory.index_buffer_size: 10%
indices.fielddata.cache.size: 20%
search.max_buckets: 20000
thread_pool.write.queue_size: 1000

9.2 索引生命周期管理(ILM)

通过 ILM 自动管理索引的创建、滚动和删除:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 在 Kibana Dev Tools 中执行
PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "7d"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}

# 创建带 ILM 的索引模板
PUT _index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"index.lifecycle.name": "logs_policy",
"index.lifecycle.rollover_alias": "logs"
}
}
}

十、常见问题排查

问题现象可能原因解决方法
Elasticsearch 启动失败max virtual memory areas 不足执行 sudo sysctl -w vm.max_map_count=262144
Kibana 无法连接 Elasticsearch认证凭据不正确或 SSL 验证失败检查 kibana.yml 中的用户名密码,设置 elasticsearch.ssl.verificationMode: none
Logstash 接收不到数据防火墙未开放 5044 端口sudo ufw allow 5044 或检查 iptables
磁盘空间不足日志索引未设置过期删除配置 ILM 策略自动删除过期索引
Filebeat 连接超时网络不通或 Logstash 未启动systemctl status logstash + filebeat test output
Kibana 加载缓慢索引数据量过大,未合理分片增加分片数、配置 ILM 滚动策略
Elasticsearch 内存溢出JVM 堆设置过大编辑 /etc/elasticsearch/jvm.options,设为物理内存的 50%

十一、总结

本文详细介绍了在 Ubuntu 22.04 上搭建 ELK Stack 的完整流程,涵盖 Elasticsearch、Logstash、Kibana 和 Filebeat 的安装配置。ELK Stack 是运维日志管理的黄金标准,掌握它能够大幅提升日常排障效率。

建议从单机部署开始熟悉各组件功能,再逐步扩展到集群架构。后续可以深入学习 Elasticsearch 查询 DSL、Kibana 可视化仪表板设计、Logstash 高级过滤插件等进阶内容。


本文由AI辅助生成,内容仅供参考

  • 标题: ELK Stack(Elasticsearch + Logstash + Kibana)环境搭建完全指南
  • 作者: Someone
  • 创建于 : 2026-06-10 09:59:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-10-elk-stack-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。