ELK/EFK 栈部署实操教程:Elasticsearch+Logstash+Kibana 集中式日志平台搭建
文章目录
集中式日志平台是运维核心工具,能解决 “日志分散、查询低效、问题定位难” 的痛点。ELK(Elasticsearch+Logstash+Kibana)是经典方案,适用于复杂日志处理;EFK(Elasticsearch+Filebeat+Kibana)用轻量采集器替代 Logstash,更适合资源有限场景。本文基于 CentOS 7/8 系统,详解单节点部署全流程,新手也能直接套用。
一、前期准备:部署前的 “3 大核心配置”
1. 系统环境要求(单节点最低配置)
-
硬件:CPU≥2 核,内存≥4G(Elasticsearch 占用内存较高,建议 8G 以上),磁盘≥50G(日志存储需预留充足空间)。
-
系统:CentOS 7.9/8.5(Ubuntu 20.04 也适用,命令稍作调整),关闭 SELinux,防火墙开放指定端口。
-
依赖:JDK 1.8+(Elasticsearch 7.x 内置 JDK,可直接使用,无需额外安装)。
2. 系统环境配置(必做步骤)
(1)关闭 SELinux 与防火墙
\ 临时关闭SELinux(重启失效)
setenforce 0
\ 永久关闭SELinux(修改配置文件)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
\ 开放所需端口(ELK核心端口)
firewall-cmd --permanent --add-port=9200/tcp Elasticsearch
firewall-cmd --permanent --add-port=5601/tcp Kibana
firewall-cmd --permanent --add-port=5044/tcp Logstash
firewall-cmd --permanent --add-port=9000/tcp Filebeat(EFK用)
firewall-cmd --reload 生效配置
(2)调整系统参数(避免 Elasticsearch 启动失败)
- 调整文件描述符限制(Elasticsearch 要求≥65535):
echo "\* soft nofile 65535" >> /etc/security/limits.conf
echo "\* hard nofile 65535" >> /etc/security/limits.conf
- 调整虚拟内存(避免内存不足报错):
echo "vm.max\_map\_count=262144" >> /etc/sysctl.conf
sysctl -p 生效配置
二、核心部署:ELK 栈(Elasticsearch+Logstash+Kibana)
1. 部署 Elasticsearch(日志存储与检索核心)
Elasticsearch 是分布式搜索引擎,负责存储日志数据并提供快速查询能力。
(1)解压与目录配置
\ 解压到/usr/local目录
tar -zxvf elasticsearch-7.17.10-linux-x86\_64.tar.gz -C /usr/local/
\ 重命名(简化操作)
mv /usr/local/elasticsearch-7.17.10 /usr/local/elasticsearch
\ 创建数据和日志目录(避免权限问题)
mkdir -p /usr/local/elasticsearch/data
mkdir -p /usr/local/elasticsearch/logs
(2)创建专用用户(Elasticsearch 禁止 root 启动)
useradd es 创建es用户
chown -R es:es /usr/local/elasticsearch/ 授权目录权限
(3)修改核心配置文件
编辑/usr/local/elasticsearch/config/elasticsearch.yml,关键配置如下(其余默认):
\ 集群名称(自定义,同一集群需一致)
cluster.name: elk-cluster
\ 节点名称(自定义)
node.name: node-1
\ 数据存储目录(对应创建的目录)
path.data: /usr/local/elasticsearch/data
\ 日志存储目录
path.logs: /usr/local/elasticsearch/logs
\ 绑定地址(0.0.0.0允许外部访问)
network.host: 0.0.0.0
\ 端口(默认9200)
http.port: 9200
\ 初始化集群节点(单节点填自身)
cluster.initial\_master\_nodes: \["node-1"]
\ 允许跨域访问(Kibana连接需要)
http.cors.enabled: true
http.cors.allow-origin: "\*"
(4)启动与验证
\ 切换到es用户
su - es
\ 后台启动Elasticsearch
/usr/local/elasticsearch/bin/elasticsearch -d
\ 验证启动状态(等待30秒,确保服务启动完成)
curl http://localhost:9200
-
成功标志:返回包含
cluster_name“elk-cluster”、version等信息的 JSON 数据。 -
常见问题:启动失败查看日志
tail -f /usr/local/elasticsearch/logs/elk-cluster.log,多为内存不足(调整 JVM 参数)或权限问题。
(5)JVM 参数优化(可选,根据内存调整)
编辑/usr/local/elasticsearch/config/jvm.options,调整堆内存大小(建议为物理内存的 50%,最大不超过 32G):
-Xms2g 初始堆内存(2G,根据实际内存调整)
-Xmx2g 最大堆内存(与初始值一致,避免频繁扩容)
2. 部署 Kibana(日志可视化界面)
Kibana 是 ELK 的可视化工具,提供日志查询、仪表盘制作、告警配置等功能。
(1)解压与目录配置
\ 解压到/usr/local目录
tar -zxvf kibana-7.17.10-linux-x86\_64.tar.gz -C /usr/local/
\ 重命名
mv /usr/local/kibana-7.17.10 /usr/local/kibana
\ 授权给es用户(与Elasticsearch同用户)
chown -R es:es /usr/local/kibana/
(2)修改核心配置文件
编辑/usr/local/kibana/config/kibana.yml,关键配置如下:
\ 绑定地址(允许外部访问)
server.host: "0.0.0.0"
\ 端口(默认5601)
server.port: 5601
\ 连接Elasticsearch的地址(填写Elasticsearch服务器IP)
elasticsearch.hosts: \["http://localhost:9200"]
\ 中文界面配置(默认英文,按需开启)
i18n.locale: "zh-CN"
(3)启动与验证
\ 切换到es用户
su - es
\ 后台启动Kibana(nohup方式避免会话断开停止)
nohup /usr/local/kibana/bin/kibana > /usr/local/kibana/logs/kibana.log 2>&1 &
-
验证:浏览器访问
http://服务器IP:5601,能打开 Kibana 登录界面(7.17.x 默认无密码,直接进入),说明部署成功。 -
启动较慢:Kibana 首次启动需加载资源,耐心等待 1-2 分钟,失败查看日志
tail -f /usr/local/kibana/logs/kibana.log。
3. 部署 Logstash(日志采集与处理)
Logstash 是日志处理管道,负责从不同来源采集日志、过滤清洗、转换格式后,输出到 Elasticsearch。
(1)解压与目录配置
\ 解压到/usr/local目录
tar -zxvf logstash-7.17.10-linux-x86\_64.tar.gz -C /usr/local/
\ 重命名
mv /usr/local/logstash-7.17.10 /usr/local/logstash
(2)创建日志采集配置文件
Logstash 通过配置文件定义 “输入→过滤→输出” 流程,以采集 Nginx 日志为例,创建/usr/local/logstash/config/nginx-log.conf:
\ 输入配置(从文件采集Nginx日志)
input {
  file {
  path => "/var/log/nginx/access.log" Nginx访问日志路径
  start\_position => "beginning" 从日志开头开始采集
  sincedb\_path => "/dev/null" 每次重启都重新采集(测试用,生产环境注释)
  }
}
\ 过滤配置(解析Nginx日志格式,转换为结构化数据)
filter {
  grok {
  match => { "message" => '%{IPORHOST:client\_ip} %{USER:ident} %{USER:auth} \\\[%{HTTPDATE:timestamp}\\] "%{WORD:method} %{URIPATH:uri\_path}(?:%{URIPARAM:uri\_param})? %{HTTPVERSION:http\_version}" %{NUMBER:status} %{NUMBER:body\_bytes\_sent} "%{DATA:referrer}" "%{DATA:user\_agent}"' }
  }
  转换timestamp字段为日期类型(便于Kibana时间筛选)
  date {
  match => \[ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  target => "@timestamp"
  }
}
\ 输出配置(输出到Elasticsearch)
output {
  elasticsearch {
  hosts => \["http://localhost:9200"] Elasticsearch地址
  index => "nginx-access-log-%{+YYYY.MM.dd}" 索引名(按日期拆分)
  }
  同时输出到控制台(测试用,生产环境注释)
  stdout { codec => rubydebug }
}
(3)启动与验证
\ 后台启动Logstash(指定配置文件)
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/nginx-log.conf > /usr/local/logstash/logs/logstash.log 2>&1 &
- 验证:查看 Logstash 日志
tail -f /usr/local/logstash/logs/logstash.log,无报错则启动成功;同时访问 Nginx 生成日志,执行curl ``http://localhost,然后在 Elasticsearch 中查询索引curl ``http://localhost:9200/nginx-access-log-$``(date +%Y.%m.%d)/_search,能返回日志数据说明采集正常。
三、轻量方案:EFK 栈(Elasticsearch+Filebeat+Kibana)
Logstash 占用资源较高(CPU / 内存消耗大),中小规模场景推荐用 Filebeat 替代 Logstash,Filebeat 是轻量级采集器,资源占用低、部署简单。
1. 部署 Filebeat(日志采集)
(1)解压与目录配置
\ 解压到/usr/local目录
tar -zxvf filebeat-7.17.10-linux-x86\_64.tar.gz -C /usr/local/
\ 重命名
mv /usr/local/filebeat-7.17.10 /usr/local/filebeat
(2)修改核心配置文件
编辑/usr/local/filebeat/filebeat.yml,关键配置如下(采集 Nginx 日志为例):
\ 关闭默认的filebeat.inputs配置
filebeat.inputs:
\- type: filestream
  enabled: true
  paths:
  - /var/log/nginx/access.log Nginx日志路径
\ 输出到Elasticsearch(直接输出,无需Logstash)
output.elasticsearch:
  hosts: \["http://localhost:9200"] Elasticsearch地址
  index: "nginx-access-log-%{+YYYY.MM.dd}" 索引名
\ 启用内置模板(自动创建索引结构)
setup.template.enabled: true
setup.template.name: "nginx-log"
setup.template.pattern: "nginx-\*"
(3)启动与验证
\ 后台启动Filebeat
nohup /usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml > /usr/local/filebeat/logs/filebeat.log 2>&1 &
- 验证:访问 Nginx 生成日志,查询 Elasticsearch 索引,能返回数据说明采集正常;Filebeat 日志查看 `tail -f /usr/local/filebeat/log
更多推荐
所有评论(0)