什么是 ELK?
ELK 是 Elasticsearch、Logstash 和 Kibana 三个开源项目的首字母缩写,它是一个功能强大的日志收集、分析和可视化平台:
- Elasticsearch:分布式搜索和分析引擎,用于存储和快速查询日志数据
- Logstash:数据收集和处理引擎,可以从多种来源获取数据,转换数据,然后将其发送到 Elasticsearch
- Kibana:可视化平台,提供了强大的图表、仪表板和查询功能,用于浏览和分析 Elasticsearch 中的数据
在本指南中,我们使用 Filebeat 代替 Logstash 作为日志收集工具,因此也可以称为 EFK 栈,这种组合更加轻量且适合于单纯的日志收集场景。
关键说明
- EFK 栈优势:Filebeat 相比 Logstash 资源占用更低,适合单纯日志收集需求
- 协同工作流程:Filebeat(采集) → Elasticsearch(存储) → Kibana(分析展示)
- 典型应用场景:服务器日志监控、应用故障排查、业务数据可视化分析
部署架构
本指南采用双服务器部署架构:
- 服务器 A:部署 ELK 核心服务(Elasticsearch 和 Kibana)
- 服务器 B:部署 Nginx 网站和 Filebeat 日志采集工具
A 服务器:部署 ELK 核心服务
推荐2G内存以上
1. 创建 Docker 网络
首先,创建一个名为 logging 的 Docker 网络,用于 Elasticsearch 和 Kibana 容器之间的通信:
docker network create logging
2. 运行 Elasticsearch 容器
启动 Elasticsearch 容器,配置单节点模式并设置适当的内存限制:
docker run -d \
--name=elasticsearch \
--net=logging \
-v elasticsearch-data:/usr/share/elasticsearch/data \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx1g" \
-p 9200:9200 \
docker.elastic.co/elasticsearch/elasticsearch:8.10.2
配置说明:
--net=logging
:使用前面创建的 Docker 网络-v elasticsearch-data:/usr/share/elasticsearch/data
:持久化存储数据-e "discovery.type=single-node"
:配置为单节点模式-e "xpack.security.enabled=false"
:关闭安全功能(生产环境建议启用)-e "ES_JAVA_OPTS=-Xms512m -Xmx1g"
:配置 JVM 内存限制-p 9200:9200
:映射 Elasticsearch HTTP 端口
3. 验证 Elasticsearch 是否正常运行
可能不会马上生效,稍等片刻,再检查 Elasticsearch 是否已成功启动
curl http://localhost:9200
如果一切正常,将返回包含版本信息的 JSON 响应。
4. 运行 Kibana 容器
启动 Kibana 容器,并连接到 Elasticsearch:
docker run -d \
--name=kibana \
--net=logging \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
-e I18N_LOCALE=zh-CN \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:8.10.2
配置说明:
--net=logging
:使用相同的 Docker 网络-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200
:指定 Elasticsearch 连接地址-e I18N_LOCALE=zh-CN
:设置中文界面-p 5601:5601
:映射 Kibana 界面端口
Kibana 启动后,可通过浏览器访问 http://<服务器A的IP>:5601
进入 Kibana 管理界面。
5. 安全设置,仅特定ip可以访问Kibana
- 先允许特定IP访问
sudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5601 -j ACCEPT
- 再拒绝其他IP
sudo iptables -I DOCKER-USER 2 -p tcp --dport 5601 -j DROP
- 验证规则顺序
sudo iptables -L DOCKER-USER -n --line-numbers
输出应类似:
Chain DOCKER-USER (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.1.11 0.0.0.0/0 tcp dpt:5601
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5601
持久化规则(避免重启丢失)
sudo apt install iptables-persistent
sudo netfilter-persistent save
如果需要更换ip,先则清理旧规则, 再重复一遍
sudo iptables -D DOCKER-USER -s 192.168.1.11 -p tcp --dport 5601 -j ACCEPT
sudo iptables -D DOCKER-USER -p tcp --dport 5601 -j DROP
B 服务器:部署 Nginx 并安装 Filebeat
1. 安装 Filebeat
使用 curl 下载 Filebeat 的 DEB 包:
curl -L -o filebeat-8.10.2-amd64.deb https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.10.2-amd64.deb
使用 dpkg 安装 DEB 包:
sudo dpkg -i filebeat-8.10.2-amd64.deb
2. 配置 Filebeat 收集 Nginx 日志
编辑 Filebeat 配置文件:
sudo nano /etc/filebeat/filebeat.yml
添加以下配置(根据实际环境修改):
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
project: ovh
app: nginx
fields_under_root: true
setup.template.name: "ovh-nginx"
setup.template.pattern: "ovh-nginx-*"
output.elasticsearch:
hosts: ["http://<服务器A的IP>:9200"]
index: "ovh-nginx-%{+yyyy.MM.dd}"
注意事项:
- 将
<服务器A的IP>
替换为实际的 A 服务器 IP 地址 - 日志路径
/var/log/nginx/access.log
可根据实际 Nginx 配置修改 - 可以添加多个日志路径,每行一个路径
fields
部分定义的字段将作为元数据附加到每条日志记录
3. 启动并设置 Filebeat 服务
启动 Filebeat 服务:
sudo systemctl start filebeat
设置 Filebeat 开机自启:
sudo systemctl enable filebeat
检查 Filebeat 运行状态:
sudo systemctl status filebeat
4. 测试日志收集
模拟生成 Nginx 访问日志:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" http://localhost
批量发送请求测试:
seq 1 10 | xargs -n1 -I{} curl -s http://localhost > /dev/null
在 Kibana 中查看日志
- 打开浏览器访问
http://<服务器A的IP>:5601
- 进入 Kibana 后,导航到 “Discover” 部分
- 创建索引模式:
- 点击 “创建数据视图”
- 输入
ovh-nginx-*
作为索引模式 - 选择时间字段(如
@timestamp
) - 点击 “创建数据视图” 按钮
- 返回 “Discover” 页面,选择刚创建的数据视图
- 现在应该能看到 Nginx 的访问日志数据
卸载Filebeat
如果需要卸载 Filebeat:
sudo systemctl stop filebeat
sudo systemctl disable filebeat
sudo apt-get remove --purge filebeat
sudo rm -rf /etc/filebeat/
sudo rm -rf /var/lib/filebeat/
sudo rm -rf /var/log/filebeat/
最后,更新APT包管理器缓存:
apt-get update