Hugo博客公告弹窗

ELK 日志收集与分析系统部署指南

什么是 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

  1. 先允许特定IP访问
sudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5601 -j ACCEPT
  1. 再拒绝其他IP
sudo iptables -I DOCKER-USER 2 -p tcp --dport 5601 -j DROP
  1. 验证规则顺序
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 中查看日志

  1. 打开浏览器访问 http://<服务器A的IP>:5601
  2. 进入 Kibana 后,导航到 “Discover” 部分
  3. 创建索引模式:
    • 点击 “创建数据视图”
    • 输入 ovh-nginx-* 作为索引模式
    • 选择时间字段(如 @timestamp
    • 点击 “创建数据视图” 按钮
  4. 返回 “Discover” 页面,选择刚创建的数据视图
  5. 现在应该能看到 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
CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-04-16 05:01
clarity统计