Linux安装EFK日志分析系统

目标:能够实现采集指定路径日志到es,用kibana实现日志分析


单es节点集群规划:

主机名 IP 地址 组件
a1 192.168.1.111 Kibana + elasticsearch
a2 192.168.1.112 Fluentd
a3 192.168.1.103 Fluentd

1、安装Elasticsearch

1.1添加 Elastic 仓库并安装 Elasticsearch

powershell 复制代码
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

cat > /etc/yum.repos.d/elastic.repo <<EOF
[elasticsearch-8.x]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
#安装elasticsearch
yum install -y elasticsearch

1.2用户配置

ES不能使用root用户来启动,必须使用普通用户来安装启动。我们必须创建一个es专门的用户

powershell 复制代码
#新建es用户并设置密码
useradd es
passwd es
powershell 复制代码
#将es用户加入elasticsearch组
usermod -G elasticsearch es
powershell 复制代码
#es用户设置为可用sudo等命令
vim /etc/sudoers 末尾添加
#es ALL=(ALL) NOPASSWD: ALL
es ALL=(ALL) ALL
#保存退出后出来生效
source /etc/sudoers

#解决问题1:es用户执行以下命令解除打开文件数据的限制:

powershell 复制代码
vim /etc/security/limits.conf末尾添加
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

问题错误信息描述:

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

#解决问题2:修改es用户可以创建的最大线程数

powershell 复制代码
vim /etc/security/limits.d/20-nproc.conf
* soft nproc 1024
 #修改为
* soft nproc 4096

问题错误信息描述:

max number of threads [1024] for user [es] likely too low, increase to at least [4096]

#解决问题3:es用户调大虚拟内存

powershell 复制代码
vim /etc/sysctl.conf末尾添加
vm.max_map_count=262144

错误信息描述:

max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

**

1.3 配置Elasticsearch(/etc/elasticsearch/elasticsearch.yml)

powershell 复制代码
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
#集群名称, 处于同一个集群所有节点,该名称必须相同
cluster.name: efk-cluster
# 节点名称. 两台机器名字必须都不一样
node.name: a1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
# 网络绑定,这里我绑定 0.0.0.0,支持外网访问
network.host: 0.0.0.0
# 设置对外服务的http端口,默认为9200
http.port: 9200
#single-node单节点集群
discovery.type: single-node
xpack.security.enabled: true
# 支持跨域访问
http.cors.enabled: true 
http.cors.allow-origin: "*"
EOF
powershell 复制代码
#编辑/etc/elasticsearch/jvm.options将注释内容修改
vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g

1.4启动Elasticsearch

powershell 复制代码
#切换es用户
su es
#启动
systemctl start elasticsearch
#开机自启
systemctl enable elasticsearch

如果报错

#查看es日志(efk-cluster是配置文件定义的集群名)

cat /var/log/elasticsearch/efk-cluster.log | tail -n 50

如果出现org.elasticsearch.ElasticsearchSecurityException: invalid configuration for xpack.security.transport.ssl - [xpack.security.transport.ssl.enabled] is not set, but the following settings have been configured in elasticsearch.yml : [xpack.security.transport.ssl.keystore.secure_password,xpack.security.transport.ssl.truststore.secure_password]

就是xpack.security.transport.ssl 的配置无效 - [xpack.security.transport.ssl.enabled] 未设置,但已在 elasticsearch.yml 中配置了以下设置

powershell 复制代码
解决方法:之前安装了缓存设置的 ElasticSearch,尝试使用以下命令重置安全设置
rm /etc/elasticsearch/elasticsearch.keystore
/usr/share/elasticsearch/bin/elasticsearch-keystore create

1.5查看密码(记录用户密码)

powershell 复制代码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

会得到如下用户和密码,保存记录

用户名 密码
elastic To0wR2hSaPLsKFBbOyHl
kibana_system NueXLxMBkbZFkL7stbP9
kibana NueXLxMBkbZFkL7stbP9
apm_system AfcXVRt1b9hdDflfNSbP
logstash_system Y9TaPbMxXB2BTpqWbIOB
beats_system hgMyPYqsxvKgAqghOEMm
remote_monitoring_user s65gIUsT97jdisnfcS2E
powershell 复制代码
#如果不是第一次启动,重置密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic --batch

2、 安装Kibana

powershell 复制代码
yum install -y kibana

2.1配置Kibana(/etc/kibana/kibana.yml)

powershell 复制代码
#下面的用户密码都拿上面记录的
cat > /etc/kibana/kibana.yml <<EOF
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "NueXLxMBkbZFkL7stbP9"
EOF

2.2启动Kibana

powershell 复制代码
#启动
systemctl start kibana
#开机自启
systemctl enable kibana

在a1 和 a2 安装 Fluentd

3、安装td-agent(Fluentd官方发行版)

powershell 复制代码
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
yum install -y td-agent

3.1配置Fluentd(/etc/td-agent/td-agent.conf)

powershell 复制代码
cat > /etc/td-agent/td-agent.conf <<EOF
# 收集系统日志
#<source>
#  @type tail
#  path /var/log/messages
#  pos_file /var/log/td-agent/messages.pos
#  tag system.messages
#  format syslog
#</source>

# 采集 /data/logs/TALogs/xjp_official 目录下的日志
<source>
  @type tail
  path /data/logs/TALogs/xjp_official/log.*_0  # 匹配 log.YYYY-MM-DD_0 格式的文件
  pos_file /var/log/td-agent/xjp_official.pos
  tag xjp_official
  format json #json格式
  time_key    #根据日志中的time进行解析
  time_format %Y-%m-%d %H:%M:%S.%L
  # 按 mtime(修改时间)排序,false优先读取最新文件,true旧数据也读取
  #read_from_head false
  read_from_head true
</source>

# 输出到Elasticsearch
<match **>
  @type elasticsearch
  host 192.168.1.111  # es-kibana节点IP
  port 9200
  user elastic
  password "To0wR2hSaPLsKFBbOyHl"
  logstash_format true
  logstash_prefix fluentd
  include_tag_key true
  tag_key @log_name
</match>
EOF
powershell 复制代码
#保证采集路径td-agent有权限访问,下列的都是方法,可采用
#添加其他用户可访问/var/log/messages
chmod o+r /var/log/messages
#td-agent用户添加到master组
usermod -G master td-agent
#将/data/logs/TALogs/xjp_official/赋权给td-agent和组
chown -R td-agent:td-agent /data/logs/TALogs/xjp_official/

3.2启动Fluentd

powershell 复制代码
#启动
systemctl start td-agent
#开机自启
systemctl enable td-agent

#查看Fluentd日志验证是否传输成功
tail -n 20 /var/log/td-agent/td-agent.log

4、访问 Kibana

打开浏览器访问 http://192.168.1.11:5601,使用 elastic 用户和密码登录。并访问dev tools

检索#account_id为250000001311的日志文件

操作备忘

1、(删除现有数据重新传输到es)无需操作!!

powershell 复制代码
#es查看已有的日志
curl -u elastic:"To0wR2hSaPLsKFBbOyHl" -X GET "http://192.168.1.111:9200/_cat/indices/fluentd-*?v"
#es删除已有日志
curl -u elastic:"To0wR2hSaPLsKFBbOyHl" -X DELETE "http://192.168.1.111:9200/fluentd-2025.05.27"
powershell 复制代码
# Fluentd删除 pos 文件
rm -f /var/log/td-agent/xjp_official.pos
#重启Fluentd
systemctl restart td-agent

2、查看日志

powershell 复制代码
#查看es日志
cat /var/log/elasticsearch/efk-cluster.log | tail -n 50
#查看Fluentd日志
tail -n 30 /var/log/td-agent/td-agent.log

kibana查询语句

powershell 复制代码
#单条件查询语句
GET fluentd*/_search
{
  "query": {
    "term": {
      "#account_id": "250000001311"
    }
  },
  "size": 100
}
#多条件查询语句
GET fluentd-*/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "properties.num": 20 }},
        { "term": { "properties.num_before": 37 }},
        { "term": { "properties.num_after": 57 }},
        { "term": { "properties.item_id.keyword": "SkinSuperBoxKey" }},
        { "match": { "#account_id": "250000001311" }}
      ]
    }
  }
}

配置多elasticsearch节点,例如配置三台elasticsearch服务器(如需)

1、多es节点操作(各节点都需)

powershell 复制代码
vim /etc/hosts末尾添加主机配置相互通信
192.168.1.111 a1
192.168.1.112 a2
192.168.1.113 a3

2、es配置文件修改(各节点都需,并修改node.name即可,discovery.seed_hosts和cluster.initial_master_nodes根据实际情况修改)

powershell 复制代码
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
#集群名称, 处于同一个集群所有节点,该名称必须相同
cluster.name: efk-cluster
# 节点名称. 两台机器名字必须都不一样
node.name: a1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
# 网络绑定,这里我绑定 0.0.0.0,支持外网访问
network.host: 0.0.0.0
# 设置对外服务的http端口,默认为9200
http.port: 9200
#TCP9300配置节点间相互通信
transport.port: 9300
# 集群发现
discovery.seed_hosts: ["192.168.1.111","192.168.1.112","192.168.1.113"]
cluster.initial_master_nodes: ["a1","a2","a3"]
# 支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF

多节点集群证书部署(如需)

1、生成ca证书

powershell 复制代码
/usr/share/elasticsearch/bin/elasticsearch-certutil ca --out elastic-stack-ca.p12 --pass "root"

2、随便一个目录/test/编写一个node.yaml文件

powershell 复制代码
vim /test/node.yaml
instances:
  - name: a1
    dns: [a1]
    ip: [192.168.1.111]
  - name: a2
    dns: [a2]
    ip: [192.168.1.112]
  - name: a3
    dns: [a3]
    ip: [192.168.1.113]
  - name: a4
    dns: [a4]
    ip: [192.168.1.114]

3、使用ca签发多节点证书

powershell 复制代码
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ca-pass "root" --in /test/node.yaml --multiple --out certs.zip --pass "root"

4、解压复制到各个节点

powershell 复制代码
#某个节点操作即可,我这里是a1服务器
unzip certs.zip -d /usr/share/elasticsearch/
cp /usr/share/elasticsearch/a1/a1.p12 -d /etc/elasticsearch/certs/
scp /usr/share/elasticsearch/a2/a2.p12 [email protected]:/etc/elasticsearch/certs/
scp /usr/share/elasticsearch/a3/a3.p12 [email protected]:/etc/elasticsearch/certs/
#文件给用户elasticsearch权限(每个节点都要)
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/

5、配置文件修改

powershell 复制代码
vim /etc/elasticsearch/elasticsearch.yml末尾添加
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certs/a1.p12
xpack.security.transport.ssl.keystore.password: root
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certs/a2.p12
xpack.security.transport.ssl.truststore.password: root

6、重启测试

powershell 复制代码
su es
systemctl restart elasticsearch
浏览器访问:192.168.1.111:9200

7、后续扩容新es节点,只需要将yaml文件中的旧节点去掉,然后添加新的节点去生成证书即可

8、查看证书有效期(根据实际情况修改一下自己的/usr/share/elasticsearch/a1/a1.p12)

powershell 复制代码
openssl pkcs12 -in /usr/share/elasticsearch/a1/a1.p12 -clcerts -nokeys -passin pass:"root" | openssl x509 -noout -dates
#得到结果生效时间:2025 年 5 月 28 日 07:28:46 GMT 过期时间:2028 年 5 月 27 日 07:28:46 GMT
MAC verified OK
notBefore=May 28 07:28:46 2025 GMT
notAfter=May 27 07:28:46 2028 GMT
相关推荐
独行soc4 分钟前
2025年渗透测试面试题总结-匿名[校招]高级安全工程师(代码审计安全评估)(题目+回答)
linux·安全·web安全·面试·职场和发展·渗透测试
LB211226 分钟前
Maven(黑马)
linux·服务器·maven
alex18011 小时前
ubuntu磁盘挂载
linux·数据库·ubuntu
Stardep1 小时前
Linux下目录递归拷贝的单进程实现
linux·运维·服务器·实验
hawk2014bj1 小时前
KVM 安装 Ubuntu 22
linux·运维·ubuntu
nako_sayuri1 小时前
Linux进程间通信----简易进程池实现
linux·服务器·进程池
藥瓿亭2 小时前
Vim常用快捷键
linux·ubuntu·centos·vim
Zfox_2 小时前
【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器
linux·服务器·c++·muduo库
小峰编程3 小时前
rsync服务的搭建
linux·运维·服务器·云原生·centos·服务搭建
零K沁雪3 小时前
Linux C 优雅的执行命令
linux·c语言