ES集群部署及EFK架构梳理

一.后续课程安排

1.介绍

- ElasticStack:6~7days
	PB级别日志分析系统。
	
- Docker: 5~6days
	容器管理工具。
	
- Prometheus: 5days 
	监控系统,尤其是在云原生领域中非常优秀。
	
- Ceph: 4days
	分布式存储系统,块存储,对象存储,文件系统。
	
- Kubernetes: 17~19days
	容器的集群编排工具。

二.ElasticStack及EFK架构梳理

1.什么是ElasticStack

ElasticStack是elastic公司推出的一系列技术栈。

早期ElasticStack的前身,有一个很火的名词叫ELK,代表的是该公司的三款日志采集方案的技术栈。
- ElasticSearch
是一款分布式高可用的数据库,主要作用就是存储和检索数据。
简称ES集群。

- Logstash
是一款日志分析处理工具,主要对数据进行过滤,处理,转换等相关操作,将处理后的数据写入ES集群。

- Kibana
需要链接ES集群,可以图形化查询ES集群数据。简化查询过程。

后来,logstash相对来说比较重量级,业界开始使用其他的日志采集工具进行替代(比如Fluentd,Flume等),官方也推出了轻量级解决方案,beats组件,其中比较出名的就是Filebeat,主要是用于日志文件采集。

于是起名字就成了一个问题,有的公司使用ELFK架构,EFK架构,ELK架构,后来官方将elk stack更名为elasticstack。

官方文档:
https://www.elastic.co/cn/

“ES8-“版本技术文档:
https://www.elastic.co/guide/index.html

2.EFK架构图解

EFK架构图解

如上图所示,EFK架构是业界目前主流的一种日志采集解决方案。

三.ElasticSearch环境部署

1.ElasticSearch单点部署

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	1.下载ES软件包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.29-x86_64.rpm


wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.29-amd64.deb


SVIP:
[root@elk91 ~]# wget http://192.168.14.253/Resources/ElasticStack/softwares/ES7/7.17.29/elasticsearch-7.17.29-amd64.deb



2.安装ES软件包
[root@elk91 ~]# ll elasticsearch-7.17.29-amd64.deb
-rw-r--r-- 1 root root 325488012 Aug 27 2025 elasticsearch-7.17.29-amd64.deb
[root@elk91 ~]#
[root@elk91 ~]#
[root@elk91 ~]# dpkg -i elasticsearch-7.17.29-amd64.deb


3.修改ES的配置文件
[root@elk91 ~]# vim /etc/elasticsearch/elasticsearch.yml
...
# 对外暴露ES的IP地址
network.host: 0.0.0.0

# 表示当前ES是一个单点,而非集群
discovery.type: single-node


4.启动ES服务
[root@elk91 ~]# systemctl start elasticsearch.service
[root@elk91 ~]#
[root@elk91 ~]# ss -ntl | egrep "92|300"
LISTEN 0 4096 *:9300 *:*
LISTEN 0 4096 *:9200 *:*
[root@elk91 ~]#


端口说明:
9200:
支持http|https协议,主要是集群外部提供服务的端口。

9300:
使用的是tcp协议,主要是用于ES集群数据内部传输的端口。


5.测试验证
[root@elk91 ~]# curl 10.0.0.91:9200
{
"name" : "elk91",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "QtOwSp-jTMms3YweEq47-Q",
"version" : {
"number" : "7.17.29",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "580aff1a0064ce4c93293aaab6fcc55e22c10d1c",
"build_date" : "2025-06-19T01:37:57.847711500Z",
"build_snapshot" : false,
"lucene_version" : "8.11.3",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[root@elk91 ~]#
[root@elk91 ~]# curl 10.0.0.91:9200/_cat/nodes
10.0.0.91 8 97 5 0.09 0.10 0.04 cdfhilmrstw * elk91
[root@elk91 ~]#

2.ElasticSearch集群部署

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
	1.停止ES单点
[root@elk91 ~]# systemctl stop elasticsearch.service
[root@elk91 ~]#
[root@elk91 ~]# ss -ntl | egrep "92|300"
[root@elk91 ~]#


2.修改ES的配置文件
[root@elk91 ~]# egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: oldboyedu-linux102-cluster
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["10.0.0.91", "10.0.0.92","10.0.0.93"]
cluster.initial_master_nodes: ["10.0.0.91", "10.0.0.92","10.0.0.93"]
[root@elk91 ~]#


相关参数说明
cluster.name
指定集群的名称,ES所有节点必须指定同样的名称,否则无法加入集群。

path.data:
数据存储路径。

path.logs:
日志存储路径。

network.host:
对外监听的地址。

discovery.seed_hosts:
分布式集群的主机列表。

cluster.initial_master_nodes
参数master选举的列表。



3.清空之前的数据
[root@elk91 ~]# rm -rf /var/{log,lib}/elasticsearch/*
[root@elk91 ~]#
[root@elk91 ~]# ll /var/{log,lib}/elasticsearch/
/var/lib/elasticsearch/:
total 8
drwxr-s--- 2 elasticsearch elasticsearch 4096 Oct 29 11:36 ./
drwxr-xr-x 61 root root 4096 Oct 29 10:08 ../

/var/log/elasticsearch/:
total 8
drwxr-s--- 2 elasticsearch elasticsearch 4096 Oct 29 11:36 ./
drwxrwxr-x 10 root syslog 4096 Oct 29 10:08 ../
[root@elk91 ~]#

4.分发软件包
[root@elk91 ~]# scp elasticsearch-7.17.29-amd64.deb 10.0.0.92:~

[root@elk91 ~]# scp elasticsearch-7.17.29-amd64.deb 10.0.0.93:~

5.其他节点安装ES服务
[root@elk92 ~]# dpkg -i elasticsearch-7.17.29-amd64.deb

[root@elk93 ~]# dpkg -i elasticsearch-7.17.29-amd64.deb


6.同步配置文件
[root@elk91 ~]# scp /etc/elasticsearch/elasticsearch.yml 10.0.0.92:/etc/elasticsearch/

[root@elk91 ~]# scp /etc/elasticsearch/elasticsearch.yml 10.0.0.93:/etc/elasticsearch/

7.同时启动ES服务【否则可能会脑裂】【脑裂:集群中出现了两个“老大”(master节点),各自为政,导致数据不一致】
[root@elk91 ~]# systemctl enable --now elasticsearch.service
[root@elk91 ~]# ss -ntl | egrep "92|300"
LISTEN 0 4096 *:9200 *:*
LISTEN 0 4096 *:9300 *:*
[root@elk91 ~]#


[root@elk92 ~]# systemctl enable --now elasticsearch.service
[root@elk92 ~]# ss -ntl | egrep "92|300"
LISTEN 0 4096 *:9300 *:*
LISTEN 0 4096 *:9200 *:*
[root@elk92 ~]#

[root@elk93 ~]# systemctl enable --now elasticsearch.service
[root@elk93 ~]# ss -ntl | egrep "92|300"
LISTEN 0 4096 *:9300 *:*
LISTEN 0 4096 *:9200 *:*
[root@elk93 ~]#

8.验证集群是否正常
[root@elk91 ~]# curl 10.0.0.91:9200/_cat/nodes
10.0.0.92 16 97 56 0.88 0.26 0.08 cdfhilmrstw * elk92
10.0.0.91 15 97 38 1.21 0.30 0.10 cdfhilmrstw - elk91
10.0.0.93 21 97 51 1.21 0.32 0.10 cdfhilmrstw - elk93
[root@elk91 ~]#
[root@elk91 ~]# curl 10.0.0.92:9200/_cat/nodes
10.0.0.91 15 97 3 1.02 0.29 0.10 cdfhilmrstw - elk91
10.0.0.93 21 97 0 1.11 0.32 0.10 cdfhilmrstw - elk93
10.0.0.92 17 91 48 0.89 0.27 0.09 cdfhilmrstw * elk92
[root@elk91 ~]#
[root@elk91 ~]# curl 10.0.0.93:9200/_cat/nodes
10.0.0.91 15 97 0 1.02 0.29 0.10 cdfhilmrstw - elk91
10.0.0.92 17 96 52 0.90 0.29 0.09 cdfhilmrstw * elk92
10.0.0.93 5 97 5 1.02 0.31 0.10 cdfhilmrstw - elk93
[root@elk91 ~]#
[root@elk91 ~]# curl 10.0.0.93:9200
{
"name" : "elk93",
"cluster_name" : "oldboyedu-linux102-es7",
"cluster_uuid" : "ChbcjlSbRTWR4V952_ZBBg",
"version" : {
"number" : "7.17.29",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "580aff1a0064ce4c93293aaab6fcc55e22c10d1c",
"build_date" : "2025-06-19T01:37:57.847711500Z",
"build_snapshot" : false,
"lucene_version" : "8.11.3",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[root@elk91 ~]#

这个正则表达式 "^#|^$" 用于 egrep -v(反向匹配),意思是排除符合条件的行,只显示有效配置行。

拆解说明:

^# — 匹配以 # 开头的行(注释行)

| — 或者

^$ — 匹配空行(^ 是行首,$ 是行尾,中间没有任何字符)

-v — 反向匹配,即排除匹配到的行

所以整条命令的效果是:读取 elasticsearch.yml,过滤掉注释行和空行,只输出真正有效的配置项

四.ES集群术语及DSL语句初体验

1.ES集群的相关术语

ES集群的常见术语

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- ES集群
多个ES服务器对外提供分布式高可用存储服务。


- ES集群的常见术语:
- 索引: index
ES集群进行数据的读写单元。

- 分片: shard
索引数据分散到多个分片进行存储。
一个索引最少要有1个分片。

- 副本: replica
对分片的数据进行备份,也可以为分片的数据提供读的负载均衡。
一个分片可以有0个副本。

- 文档
- 元数据和源数据。

2.ES相关的面试题

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
Q1: ES集群的端口使用协议及作用?
- 9200:
协议: http|https
作用: ES集群对外的访问端口。

- 9300:
协议: TCP
作用: 集群内部数据传输端口。


温馨提示:
优先启动9300端口,再启动9200.


Q2: ES集群有哪些颜色,分别代表什么含义?
- red:
部分主分片无法正常访问。

- yellow:
部分副本分片无法访问。

- green:
所有的主分片和副本分片均可以正常访问。


查看集群的状态:
[root@elk91 ~]# curl 10.0.0.93:9200/_cat/health
1772420117 02:55:17 oldboyedu-linux101-cluster green 3 3 6 3 0 0 0 0 - 100.0%
[root@elk91 ~]#
[root@elk91 ~]# curl 10.0.0.93:9200/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1772420072 02:54:32 oldboyedu-linux101-cluster green 3 3 6 3 0 0 0 0 - 100.0%
[root@elk91 ~]#

Elasticsearch 天生就是分布式的,核心靠两个概念保证数据安全:

分片(Shard)

  • 把一个索引的数据切成多块,分散存到不同节点
  • 比如1000万条数据,分成5个分片,每个节点存200万

副本(Replica)

  • 每个分片可以有1个或多个副本,存在不同节点
  • 主分片坏了,副本自动顶上
1
2
3
节点1: 主分片A  副本B
节点2: 主分片B 副本C
节点3: 主分片C 副本A

只要副本数 ≥ 1,数据不会丢。

1
2
3
4
5
6
7
8
正常状态:
节点1 [主分片1] [副本2]
节点2 [主分片2] [副本3]
节点3 [主分片3] [副本1]

节点1 挂掉后:
节点2 [主分片2] [副本3] [副本1晋升为主分片1] ← 自动接管
节点3 [主分片3] [副本1→主分片1]

ES 会自动把副本晋升为主分片,集群继续正常服务。

⚠️ 什么时候会丢数据?

  • 副本数设为 0
  • 主分片和它唯一的副本恰好在同一节点(ES默认会避免这种情况)

全量更新vs增量更新

增量更新 — 只更新变化的字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 只改 age 字段
POST /users/_update/1
{
"doc": { "age": 25 }
}
```

**全量更新(ES的实际机制)** — ES 底层的 update 其实是:
```
① 读取旧文档
② 合并新字段
③ 删除旧文档
④ 写入新文档(版本号+1
```

ES 的文档是**不可变的**,所谓"更新"本质上是**删除旧的,写入新的**。
```
更新前: { id:1, name:"张三", age:24 } version:1
更新后: { id:1, name:"张三", age:25 } version:2 ← 全新写入
旧文档被标记删除,等待后台merge清理
```

> 所以大量频繁更新会有性能开销,这是 ES 的特性。

3.ES集群的DSL语句初体验

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
	1.写入数据
[root@elk93 ~]# curl --location --request POST 'http://10.0.0.91:9200/_bulk' \
--header 'Content-Type: application/json' \
--data-raw '{ "create" : { "_index" : "oldboyedu-linux", "_id" : "1001" } }
{ "name" : "孙悟空","hobby": ["蟠桃","仙丹","紫霞仙子"] }
{ "create" : { "_index" : "oldboyedu-linux", "_id" : "1002" } }
{ "name" : "猪八戒","hobby": ["吃","睡","高老庄"] }
{ "create" : { "_index" : "oldboyedu-linux", "_id" : "1003" } }
{ "name" : "沙和尚","hobby": ["大师兄,师傅被妖怪抓走了","二师兄,师傅被妖怪抓走了"] }
'


2.查看所有数据
[root@elk91 ~]# apt -y install jq
[root@elk91 ~]#
[root@elk91 ~]# curl -s http://10.0.0.93:9200/oldboyedu-linux/_search | jq
{
"took": 42,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1001",
"_score": 1,
"_source": {
"name": "孙悟空",
"hobby": [
"蟠桃",
"仙丹",
"紫霞仙子"
]
}
},
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1002",
"_score": 1,
"_source": {
"name": "猪八戒",
"hobby": [
"吃",
"睡",
"高老庄"
]
}
},
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1003",
"_score": 1,
"_source": {
"name": "沙和尚",
"hobby": [
"大师兄,师傅被妖怪抓走了",
"二师兄,师傅被妖怪抓走了"
]
}
}
]
}
}
[root@elk91 ~]#


3.查看指定数据
[root@elk91 ~]# curl -s http://10.0.0.93:9200/oldboyedu-linux/_doc/1003 | jq
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1003",
"_version": 1,
"_seq_no": 2,
"_primary_term": 1,
"found": true,
"_source": {
"name": "沙和尚",
"hobby": [
"大师兄,师傅被妖怪抓走了",
"二师兄,师傅被妖怪抓走了"
]
}
}
[root@elk91 ~]#




4.模糊查询
[root@elk91 ~]# curl -s --location --request GET '10.0.0.93:9200/oldboyedu-linux/_search' --header 'Content-Type: application/json' --data-raw '{
"query": {
"match": {
"hobby": "蟠桃"
}
}
}' | jq
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 2.2510834,
"hits": [
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1001",
"_score": 2.2510834,
"_source": {
"name": "孙悟空",
"hobby": [
"蟠桃",
"仙丹",
"紫霞仙子"
]
}
}
]
}
}
[root@elk91 ~]#


5.修改数据
[root@elk91 ~]# curl --location --request POST 'http://10.0.0.93:9200/oldboyedu-linux/_doc/1003' \
--header 'Content-Type: application/json' \
--data-raw '{
"docs": {
"hobby": ["念经","拜佛","女儿国"],
"name": "唐僧"
}
}' | jq



[root@elk91 ~]# curl -s http://10.0.0.93:9200/oldboyedu-linux/_doc/1003 | jq
{
"_index": "oldboyedu-linux",
"_type": "_doc",
"_id": "1003",
"_version": 2,
"_seq_no": 3,
"_primary_term": 1,
"found": true,
"_source": {
"docs": {
"hobby": [
"念经",
"拜佛",
"女儿国"
],
"name": "唐僧"
}
}
}
[root@elk91 ~]#



6.删除指定的文档
[root@elk91 ~]# curl -s -X DELETE http://10.0.0.93:9200/oldboyedu-linux/_doc/1003 | jq


7.删除索引(删除索引意味着该索引下的所有文档都被删除)
[root@elk91 ~]# curl -s -X DELETE http://10.0.0.93:9200/oldboyedu-linux/ | jq


Postman 是什么?

Postman 是一个接口调试工具,可以方便地发送 HTTP 请求,不用写代码。

为什么 ES 要用 Postman?

ES 提供的是 REST API,所有操作都通过 HTTP 请求完成:

ES 常用操作对照表

操作HTTP方法示例
查询文档GETGET /索引名/_doc/1
新增文档POSTPOST /索引名/_doc
更新文档PUT/POSTPUT /索引名/_doc/1
删除文档DELETEDELETE /索引名/_doc/1

Postman 请求示例

1
2
3
4
5
6
7
8
9
10
GET http://localhost:9200/my-index/_search
Content-Type: application/json

{
"query": {
"match": {
"name": "张三"
}
}
}

五.Kibana组件部署

1.部署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
27
28
29
30
31
32
33
34
35
36
37
38
39
下载地址:
https://www.elastic.co/cn/downloads/



1.下载kibana软件包
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.29-amd64.deb

SVIP:
[root@elk91 ~]# wget http://192.168.14.253/Resources/ElasticStack/softwares/ES7/7.17.29/kibana-7.17.29-amd64.deb


2.安装kibana
[root@elk91 ~]# ll kibana-7.17.29-amd64.deb
-rw-r--r-- 1 root root 296302034 Aug 27 14:35 kibana-7.17.29-amd64.deb
[root@elk91 ~]#
[root@elk91 ~]#
[root@elk91 ~]# dpkg -i kibana-7.17.29-amd64.deb


3.修改kibana的配置文件
[root@elk91 ~]# vim /etc/kibana/kibana.yml
...
# 监听的IP地址
server.host: "0.0.0.0"
# 使用ES集群地址列表
elasticsearch.hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
# 指定使用的语言
i18n.locale: "zh-CN"

4.启动kibana服务
[root@elk91 ~]# systemctl enable --now kibana.service
[root@elk91 ~]# ss -ntl | grep 5601
LISTEN 0 511 0.0.0.0:5601 0.0.0.0:*
[root@elk91 ~]#


5.访问WebUI(如上图所示)
http://10.0.0.91:5601/

2.kibana基础使用

1
略,见视频。

继续点击Kibana 索引模式 ——> 创建索引模式

后点击Discover

选择相应的索引与字段

六.Filebeat环境部署实战

1.部署Filebeat环境

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
官方文档导航栏:
https://www.elastic.co/guide/index.html



1.下载Filebeat软件包
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.29-amd64.deb


SVIP:
[root@elk92 ~]# wget http://192.168.14.253/Resources/ElasticStack/softwares/ES7/7.17.29/filebeat-7.17.29-amd64.deb


2.安装filebeat
[root@elk92 ~]# ll filebeat-7.17.29-amd64.deb
-rw-r--r-- 1 root root 37540424 Aug 27 2025 filebeat-7.17.29-amd64.deb
[root@elk92 ~]#
[root@elk92 ~]# dpkg -i filebeat-7.17.29-amd64.deb


3.编写配置文件
[root@elk92 ~]# mkdir /etc/filebeat/config
[root@elk92 ~]#
[root@elk92 ~]# cat /etc/filebeat/config/01-stdin-to-console.yaml
filebeat.inputs:
- type: stdin


output.console:
pretty: true
[root@elk92 ~]#

4.启动Filebeat实例
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/01-stdin-to-console.yaml


5.测试数据
www.oldboyedu.com # 这是我输入的数据
{
"@timestamp": "2025-10-29T08:40:26.653Z", # 数据的采集时间
"@metadata": {
"beat": "filebeat",
"type": "_doc",
"version": "7.17.29"
},
"agent": {
"hostname": "elk92",
"ephemeral_id": "d99b56a4-3248-479b-91f1-fe787b19bc2e",
"id": "4676f153-6dfe-4aa8-a370-6d171221b6e3",
"name": "elk92",
"type": "filebeat",
"version": "7.17.29"
},
"log": {
"file": {
"path": ""
},
"offset": 0
},
"message": "www.oldboyedu.com", # 这是采集到用户输入的数据。
"input": {
"type": "stdin"
},
"ecs": {
"version": "1.12.0"
},
"host": {
"name": "elk92" # 数据从哪个节点采集到的
}
}

2.Filebeat采集文本日志实战

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
40
41
42
43
44
45
46
	1.编写Filebeat配置文件 
[root@elk92 ~]# cat /etc/filebeat/config/02-log-to-console.yaml
filebeat.inputs:
- type: log
paths:
- /tmp/xixi.log

output.console:
pretty: true
[root@elk92 ~]#

2.启动Filebeat实例
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/02-log-to-console.yaml


3.测试验证
[root@elk92 ~]# echo ABC > /tmp/xixi.log
[root@elk92 ~]#
[root@elk92 ~]# cat /tmp/xixi.log
ABC
[root@elk92 ~]#
[root@elk92 ~]# echo -n oldboy >> /tmp/xixi.log # 去掉换行符写入!
[root@elk92 ~]#
[root@elk92 ~]# cat /tmp/xixi.log # 注意,文本是没有换行符的!
ABC
oldboy[root@elk92 ~]#
[root@elk92 ~]#
[root@elk92 ~]# echo 2025 >> /tmp/xixi.log #不难发现,数据是追加写入的
[root@elk92 ~]#
[root@elk92 ~]# cat /tmp/xixi.log
ABC
oldboy2025
[root@elk92 ~]#



总结:
- 1.filebeat默认按行采集文本数据;
- 2.Filebeat默认会保留采集数据的位置点;
/var/lib/filebeat/registry/filebeat/log.json

- 3.如果需要Filebeat从头采集数据,可以删除原有的数据目录,生产环境中慎用!
[root@elk92 ~]# rm -rf /var/lib/filebeat/
[root@elk92 ~]#
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/02-log-to-console.yaml

3.课堂练习-Filebeat采集nginx案例

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
40
41
42
43
- 需求
- 1.部署nginx服务器,并访问测试;
- 2.使用Filebeat采集nginx的访问日志并输出到终端;


- 参考案例:
1.安装nginx
[root@elk92 ~]# apt -y install nginx
[root@elk92 ~]#
[root@elk92 ~]# ss -ntl | grep 80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 [::]:80 [::]:*
[root@elk92 ~]#


2.访问测试
[root@elk91 ~]# curl 10.0.0.92

也可以使用window直接基于ip地址访问

3.查看访问日志
[root@elk92 ~]# tail -100f /var/log/nginx/access.log
10.0.0.1 - - [12/Mar/2026:15:50:29 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
10.0.0.1 - - [12/Mar/2026:15:50:29 +0800] "GET /favicon.ico HTTP/1.1" 404 197 "http://10.0.0.92/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
10.0.0.91 - - [12/Mar/2026:15:50:47 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"


4.编写Filebeat的配置文件
[root@elk92 ~]# cat /etc/filebeat/config/03-nginx-to-console.yaml
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/access.log

output.console:
pretty: true
[root@elk92 ~]#


5.启动Filebeat实例
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/03-nginx-to-console.yaml


七.EFK架构采集nginx实战案例

1.EFK架构采集nginx日志

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
40
41
42
43
44
45
46
47
48
49
50
	1.安装nginx服务
[root@elk92 ~]# apt -y install nginx


2.Filebeat采集nginx的访问日志
[root@elk92 ~]# cat /etc/filebeat/config/04-nginx-to-es.yaml
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/access.log

#output.console:
# pretty: true


output.elasticsearch:
# 指定ES集群地址
hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
# 指定ES的索引名称
index: "oldboyedu-linux-filebeat-nginx-%{+yyyy.MM.dd}"


# 禁用ILM索引生命周期,如果启用则忽略index的配置。
setup.ilm.enabled: false
# 定义索引模板名称,可以自定义。
setup.template.name: "oldboyedu-linux"
# 定义ES集群的索引模式(将来会匹配索引名称,符合则根据该索引模板进行初始化配置)。
setup.template.pattern: "oldboyedu-linux-filebeat*"
# 如果已经有同名称的索引模板是否覆盖。
setup.template.overwrite: false
# 定义索引模板的设置。
setup.template.settings:
# 指定索引的分片数量。
index.number_of_shards: 3
# 指定索引的副本数量。
index.number_of_replicas: 0
[root@elk92 ~]#

3.启动Filebeat实例
[root@elk92 ~]# rm -rf /var/lib/filebeat/
[root@elk92 ~]#
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/04-nginx-to-es.yaml


4.kibana查看数据
略,见视频。


5.实时查看数据
如上图所示。

2.Filebeat模块管理实战

2.1 查看模块

1
2
3
4
5
6
7
[root@elk92 ~]# filebeat modules list
Enabled: # 已经启用的模块列表

Disabled: # 已经禁用的模块列表
activemq
apache
...

2.2 启动模块

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
	1.启动多个模块
[root@elk92 ~]# filebeat modules enable nginx tomcat mysql
Enabled nginx
Enabled tomcat
Enabled mysql
[root@elk92 ~]#

2.查看模块列表
[root@elk92 ~]# filebeat modules list
Enabled:
mysql
nginx
tomcat

Disabled:
activemq
apache
auditd
...

3.底层逻辑
[root@elk92 ~]# ll /etc/filebeat/modules.d/*.yml
-rw-r--r-- 1 root root 472 Jun 19 00:32 /etc/filebeat/modules.d/mysql.yml
-rw-r--r-- 1 root root 784 Jun 19 00:32 /etc/filebeat/modules.d/nginx.yml
-rw-r--r-- 1 root root 623 Jun 19 00:32 /etc/filebeat/modules.d/tomcat.yml
[root@elk92 ~]#

2.3 禁用模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	1.禁用多个模块
[root@elk92 ~]# filebeat modules disable mysql tomcat
Disabled mysql
Disabled tomcat
[root@elk92 ~]#

2.查看模块列表
[root@elk92 ~]# filebeat modules list
Enabled:
nginx

Disabled:
activemq
apache
...

3.查看底层逻辑
[root@elk92 ~]# ll /etc/filebeat/modules.d/*.yml
-rw-r--r-- 1 root root 784 Jun 19 00:32 /etc/filebeat/modules.d/nginx.yml
[root@elk92 ~]#

2.4 底层逻辑验证

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
	1.模拟启用模块
[root@elk92 ~]# mv /etc/filebeat/modules.d/mysql.yml{.disabled,}
[root@elk92 ~]#
[root@elk92 ~]# ll /etc/filebeat/modules.d/*.yml
-rw-r--r-- 1 root root 472 Jun 19 00:32 /etc/filebeat/modules.d/mysql.yml
-rw-r--r-- 1 root root 784 Jun 19 00:32 /etc/filebeat/modules.d/nginx.yml
[root@elk92 ~]#

2.查看模块验证
[root@elk92 ~]# filebeat modules list
Enabled:
mysql
nginx

Disabled:
activemq
apache
auditd
...

3.模拟禁用模块
[root@elk92 ~]# mv /etc/filebeat/modules.d/mysql.yml{,.disabled}
[root@elk92 ~]#
[root@elk92 ~]# ll /etc/filebeat/modules.d/mysql.yml*
-rw-r--r-- 1 root root 472 Jun 19 00:32 /etc/filebeat/modules.d/mysql.yml.disabled
[root@elk92 ~]#

4.再次查看验证
[root@elk92 ~]# filebeat modules list
Enabled:
nginx

Disabled:
activemq
apache
...

3.filebeat基于模块采集nginx日志

3.1 准备nginx的访问日志

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
[root@elk92 ~]# cat /var/log/nginx/access.log 
123.113.31.55 - - [29/Oct/2025:17:15:15 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
123.113.31.55 - - [29/Oct/2025:17:15:15 +0800] "GET /favicon.ico HTTP/1.1" 404 197 "http://10.0.0.92/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
23.13.31.55 - - [29/Oct/2025:17:27:23 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
33.33.31.55 - - [29/Oct/2025:17:28:04 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
43.113.31.55 - - [29/Oct/2025:17:28:05 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
53.93.31.55 - - [29/Oct/2025:17:28:05 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
63.83.31.55 - - [29/Oct/2025:17:28:06 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
73.73.31.55 - - [29/Oct/2025:17:28:06 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
83.63.31.55 - - [29/Oct/2025:17:28:07 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
93.53.31.55 - - [29/Oct/2025:17:28:07 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
103.43.31.55 - - [29/Oct/2025:17:28:08 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
113.33.31.55 - - [29/Oct/2025:17:28:08 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
123.22.31.55 - - [29/Oct/2025:17:28:09 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.81.0"
3.22.31.55 - - [30/Oct/2025:09:46:12 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
4.22.31.55 - - [30/Oct/2025:09:46:12 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
5.22.31.55 - - [30/Oct/2025:09:46:12 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
3.22.31.55 - - [30/Oct/2025:09:46:12 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
31.22.31.55 - - [30/Oct/2025:09:46:12 +0800] "GET /favicon.ico HTTP/1.1" 404 134 "http://10.0.0.92/" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
32.22.31.55 - - [30/Oct/2025:09:46:39 +0800] "GET /oldboyedu.html HTTP/1.1" 404 134 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
33.33.31.55 - - [30/Oct/2025:09:48:57 +0800] "GET /linux100.html HTTP/1.1" 404 134 "-" "Mozilla/5.0 (iPad; CPU OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
55.33.31.55 - - [30/Oct/2025:09:49:27 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36"
5.33.31.55 - - [30/Oct/2025:09:49:27 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36"
6.33.31.55 - - [30/Oct/2025:09:49:27 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36"
7.33.31.55 - - [30/Oct/2025:09:49:27 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36"
[root@elk92 ~]#
[root@elk92 ~]# wc -l /var/log/nginx/access.log
24 /var/log/nginx/access.log
[root@elk92 ~]#
[root@elk92 ~]#

3.2 编写Filebeat的模块文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	1.查看启用的模块文件列表
[root@elk92 ~]# ll /etc/filebeat/modules.d/*.yml
-rw-r--r-- 1 root root 784 Jun 19 00:32 /etc/filebeat/modules.d/nginx.yml
[root@elk92 ~]#

2.修改nginx的模块配置
[root@elk92 ~]# vim /etc/filebeat/modules.d/nginx.yml
[root@elk92 ~]#
[root@elk92 ~]# egrep -v "^.*#|^$" /etc/filebeat/modules.d/nginx.yml
- module: nginx
access:
enabled: true
var.paths: ["/var/log/nginx/access.log*"]
error:
enabled: false
ingress_controller:
enabled: false
[root@elk92 ~]#

3.3 编写Filebeat的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@elk92 ~]# cat /etc/filebeat/config/05-modules_nginx-to-es.yaml 
# 启用模块配置
filebeat.config.modules:
# 指定模块的路径,此处的'${path.config}'会找到模块的配置文件路径,启动Filebeat时会定义该参数
path: ${path.config}/modules.d/*.yml
# 是否支持热加载配置文件
reload.enabled: true


output.elasticsearch:
hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
index: "oldboyedu-linux-filebeat-modules-nginx-%{+yyyy.MM.dd}"

setup.ilm.enabled: false
setup.template.name: "oldboyedu-linux"
setup.template.pattern: "oldboyedu-linux-filebeat*"
setup.template.overwrite: false
setup.template.settings:
index.number_of_shards: 3
index.number_of_replicas: 0
[root@elk92 ~]#

3.4 启动Filebeat实例

1
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/05-modules_nginx-to-es.yaml 

3.5 kibana查询相关的字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
host.name

log.file.path

source.geo.city_name

source.geo.country_name

url.path

user_agent.os.full

user_agent.device.name

traefik.access.user_agent.name

source.ip

http.response.status_code

3.6 过滤数据

1
2
3
4
5
如上图所示,例如过滤404的状态码的KQL语句:  

http.response.status_code : 404

http.response.status_code : 200 and source.geo.country_name : "United States"

八.Filebeat多实例

1.什么是Filebeat多实例

1
2
3
所谓的Filebeat多实例就是共用同一套Filebeat程序启动多个Filebeat进程。

说白了,就是在一台服务器上运行多个Filebeat程序。

2.实战案例

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
	1.启动第一个实例
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/01-stdin-to-console.yaml


2.启动第二个实例时需要指定新的数据路径
[root@elk92 ~]# filebeat -e -c /etc/filebeat/config/02-log-to-console.yaml --path.data /tmp/xixi


温馨提示:
当一个节点启动多个Filebeat实例时,如果不指定新的数据目录,则可能会报错如上图所示。


3.查看进程信息
[root@elk92 ~]# ps -ef | grep filebeat | grep -v grep
root 5355 1278 0 17:22 pts/0 00:00:00 /usr/share/filebeat/bin/filebeat --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat -e -c /etc/filebeat/config/01-stdin-to-console.yaml
root 5377 3685 0 17:22 pts/1 00:00:00 /usr/share/filebeat/bin/filebeat --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat -e -c /etc/filebeat/config/02-log-to-console.yaml --path.data /tmp/xixi
[root@elk92 ~]#
[root@elk92 ~]#
[root@elk92 ~]# ll /var/lib/filebeat/
total 16
drwxr-x--- 3 root root 4096 Mar 12 17:22 ./
drwxr-xr-x 63 root root 4096 Mar 12 15:56 ../
-rw------- 1 root root 0 Mar 12 17:22 filebeat.lock
-rw------- 1 root root 100 Mar 12 15:56 meta.json
drwxr-x--- 3 root root 4096 Mar 12 15:56 registry/
[root@elk92 ~]#
[root@elk92 ~]# ll /tmp/xixi
total 16
drwxr-x--- 3 root root 4096 Mar 12 17:22 ./
drwxrwxrwt 18 root root 4096 Mar 12 17:22 ../
-rw------- 1 root root 0 Mar 12 17:22 filebeat.lock
-rw------- 1 root root 100 Mar 12 17:22 meta.json
drwxr-x--- 3 root root 4096 Mar 12 17:22 registry/
[root@elk92 ~]#

九.今日内容回顾及作业

1.今日内容回顾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- ElasticStack			*****
- ElasticSearch
- Logstash
- Kibana
- Filebeat

- ElasticSearch环境部署
- 单点部署 **
- 集群部署 *****
- 常用术语 *****
- DSL语句初体验 *

- kibana环境部署 *****

- Filebeat环境部署
- Filebeat采集文本的原理 *****
- Filebeat写入数据到ES集群 *****
- Filebeat的多实例 ***

- EFK架构分析nginx日志 *****

2.今日作业

1
2
3
4
5
6
7
8
- 完成课堂的所有练习并整理思维导图;

- 使用EFK架构分析ubuntu系统(elk91,elk92,elk93)日志并写入ES集群,使用kibana查看数据
- /var/log/auth.log
- /var/log/syslog
- /var/log/kern.log

- 使用ansible在麒麟系统一键部署ES集群

3.扩展作业

1
2
3
4
5
6
- 让windows系统翻墙,测试站点如下:
- https://hub.docker.com/
- https://www.google.com/


- 使用ansible一键部署EFK架构

十.自己整理

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
1.vim设置给当前正在编辑的行加下划线
编辑/etc/vim/vimrc
添加以下内容:
#开启当前行高亮
set cursorline
#显示行号
set number
保存退出后,重新打开 vim 即可生效。

2.
ubuntu bash设置
export PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \W\[\e[0m\]]\\$"

ubuntu查看系统版本
cat /etc/os-release

ubuntu设置静态IP
vim /etc/netplan/00-installer-config.yaml
netplan apply

ubuntu普通用户切换至root用户 sudo su -
重置root密码 passwd root
ubuntu默认禁止root用户通过SSH登录,需要先开启。
第一步:修改 SSH 配置
bashvi /etc/ssh/sshd_config
找到这一行,改为 yes
# 找到这行
PermitRootLogin prohibit-password
# 改为
PermitRootLogin yes
第二步:重启 SSH 服务
bashsystemctl restart sshd

3.typora生成目录
方法:输入 [TOC] 自动生成目录
在文档任意位置输入:
[TOC]
回车后 Typora 会自动根据文档中的标题(# ## ###)生成目录,并且是实时更新的。

4.curl -s 静默模式
curl -s 参数说明
`-s` 是 `--silent` 的缩写,意思是**静默模式**。
作用
隐藏 curl 的**进度条和错误信息**,只输出请求结果。

5.EFK 中索引 vs 索引模式的区别
索引(index) 是 Elasticsearch里真实存储数据的地方
索引模式(index pattern) 是 Kibana里用来匹配索引的规则,本身不存数据

6.Linux终端
Linux 默认提供:6 个虚拟控制终端(tty1–tty6)
Linux 本地终端 Alt + F1 ~ F6 切换 6 个虚拟终端
Xshell Alt+数字 切换SSH会话

7.nginx的autoindex功能,开启后可以直接浏览和下载目录里的文件。

配置步骤

  1. 编辑 Nginx 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name your-domain.com; # 或者填IP

location /files/ {
root /data; # 实际目录是 /data/files/
autoindex on; # 开启目录浏览
autoindex_exact_size off; # 文件大小显示人性化(KB/MB)
autoindex_localtime on; # 显示本地时间
charset utf-8; # 中文文件名不乱码
}
}
  1. 创建存放文件的目录
1
2
3
4
mkdir -p /data/files
chmod 755 /data/files
# 把文件放进去
cp yourfile.zip /data/files/
  1. 重载 Nginx
1
2
nginx -t          # 先检查配置有没有错
systemctl reload nginx
  1. 访问效果
1
2
3
4
5
6
浏览器打开 `http://your-ip/files/`,会看到类似这样的页面:
​```
Index of /files/
../
yourfile.zip 2024-01-01 12:00 10M
document.pdf 2024-01-02 09:00 2.5M

点击文件名即可下载。

注意:

这是因为 autoindex 对路径末尾的 / 很敏感


原因

/files/files/ 在 Nginx 看来是不同的路径:

  • http://10.0.0.91/files/ → 明确表示这是一个目录,Nginx 正常处理
  • http://10.0.0.91/files → Nginx 认为这可能是一个文件,找不到就返回 404

解决方法

在配置里加上 return 301 自动跳转,访问 /files 时自动补上 /

1
2
3
4
5
6
7
8
9
10
11
location = /files {
return 301 /files/;
}

location /files/ {
root /data;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
}

重载配置后:

1
nginx -t && nginx -s reload

之后访问 http://10.0.0.91/files 会自动跳转到 http://10.0.0.91/files/,两种写法都能用了。


上传文件

⚠️ Nginx 默认不支持上传,只能下载/浏览。

上传有几种方案:

方案说明
nginx-upload-module编译安装第三方模块,较复杂
scp / rsync直接命令行传到服务器目录
搭配后端服务用 Python/Node 写个上传接口,Nginx 反代
推荐:用 vsftpdsamba专门做文件传输,更合适

安全建议

如果服务器对外暴露,建议加上密码验证:

1
2
3
4
5
6
7
8
9
10
location /files/ {
root /data;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;

# 加密码保护
auth_basic "请输入密码";
auth_basic_user_file /etc/nginx/.htpasswd;
}

生成密码文件:

1
2
3
4
5
# 安装工具
yum install httpd-tools -y

# 创建用户名 admin
htpasswd -c /etc/nginx/.htpasswd admin

nginx重新加载配置文件命令

常用的有以下几种:

1
2
3
4
5
6
7
8
# 推荐,平滑重载,不中断服务
systemctl reload nginx

# 或者用 nginx 自带命令
nginx -s reload

# 先检查配置语法,再重载(推荐流程)
nginx -t && nginx -s reload

区别reload 是平滑重载配置,不会中断现有连接;restart 是完全重启,会短暂中断服务,能不用就不用。

nginx中的目录

root 的实际路径 = root 的值 + location 的路径

1
2
3
4
5
6
7
8
location /files/ {
root /data;
}
```

所以实际目录是:
```
/data + /files/ = /data/files/

对比几个例子

root 值location实际目录访问URL
/data/files//data/files/http://ip/files/
//files//files/http://ip/files/
/var/www/files//var/www/files/http://ip/files/
/data//data/http://ip/

alias 就不一样了

alias直接替换,不拼接:

1
2
3
4
5
6
7
8
9
10
11
# 用 root(拼接)
location /files/ {
root /data;
# 实际路径 → /data/files/
}

# 用 alias(替换)
location /files/ {
alias /data/;
# 实际路径 → /data/
}

一句话总结

  • root = root路径 拼上 location路径,目录名要对得上
  • alias = 直接用 alias 的路径,完全替换 location 部分
命令作用
echo -n输出内容但不换行
cat -A显示隐藏字符(换行、tab等)
ll -i查看文件 inode 编号
yyVim复制一行
pVim粘贴

十一.作业

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 完成课堂的所有练习并整理思维导图;

- 使用EFK架构分析ubuntu系统(elk91,elk92,elk93)日志并写入ES集群,使用kibana查看数据
- /var/log/auth.log
- /var/log/syslog
- /var/log/kern.log

- 使用ansible在麒麟系统一键部署ES集群

- 让windows系统翻墙,测试站点如下:
- https://hub.docker.com/
- https://www.google.com/


- 使用ansible一键部署EFK架构
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
40
41
42
43
- 使用EFK架构分析ubuntu系统(elk91,elk92,elk93)日志并写入ES集群,使用kibana查看数据
- /var/log/auth.log
- /var/log/syslog
- /var/log/kern.log

### 整体数据流

elk91 Filebeat → ↘
elk92 Filebeat → → ES集群 → Kibana 按 hostname 筛选
elk93 Filebeat → ↗

root@elk91:/etc/filebeat/config# cat 06-ubuntu-to-es.yaml
filebeat.inputs:
- type: log
paths:
- /var/log/auth.log
- /var/log/syslog
- /var/log/kern.log

#output.console:
##pretty: true

output.elasticsearch:
# 指定ES集群地址
hosts: ["http://10.0.0.91:9200","http://10.0.0.92:9200","http://10.0.0.93:9200"]
# 指定ES的索引名称
index: "oldboyedu-linux-filebeat-ubuntu-%{+yyyy.MM.dd}"


# 禁用ILM索引生命周期,如果启用则忽略index的配置。
setup.ilm.enabled: false
# 定义索引模板名称,可以自定义。
setup.template.name: "oldboyedu-linux"
# 定义ES集群的索引模式(将来会匹配索引名称,符合则根据该索引模板进行初始化配置)。
setup.template.pattern: "oldboyedu-linux-filebeat*"
# 如果已经有同名称的索引模板是否覆盖。
setup.template.overwrite: false
# 定义索引模板的设置。
setup.template.settings:
# 指定索引的分片数量。
index.number_of_shards: 3
# 指定索引的副本数量。
index.number_of_replicas: 0
1
使用ansible在麒麟系统一键部署ES集群
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
40
41
42
43
44
45
46
47
48
49
50
在hosts里与elk11,elk12,elk13建立免密钥连接
[root@m01 ansible]#cat hosts
[elk]
elk11 ansible_ssh_host=10.0.0.11
elk12 ansible_ssh_host=10.0.0.12
elk13 ansible_ssh_host=10.0.0.13

[all:vars]
ansible_user=root
ansible_ssh_pass=oldboy123.com
ansible_ssh_common_args='-o StrictHostKeyChecking=no'

创建roles目录
mkdir roles
cd roles/

通过命令生成名为es的角色,后面用于执行playbook
ansible-galaxy init es

将前面准备好的安装包和配置文件都放到/etc/ansible/roles/es/files目录下
[root@m01 files]#ls
elasticsearch-7.17.29-x86_64.rpm elasticsearch.yml
注:kylin系统可安装rpm包

在/etc/ansible/roles/es/tasks下的main.yml书写剧本
[root@m01 tasks]#cat main.yml
---
# tasks file for es

- name: copy elasticsearch package
copy:
src: elasticsearch-7.17.29-x86_64.rpm
dest: /root/elasticsearch-7.17.29-x86_64.rpm

- name: install elasticsearch
yum:
name: /root/elasticsearch-7.17.29-x86_64.rpm
disable_gpg_check: yes
state: present

- name: copy elasticsearch config
copy:
src: elasticsearch.yml
dest: /etc/elasticsearch/elasticsearch.yml

- name: enable and start elasticsearch
service:
name: elasticsearch
state: started
enabled: yes
1
- 使用ansible一键部署EFK架构

机器准备

名称描述IP系统
m01Ansible所在的服务器10.0.0.81Kylin Linux Advanced Server V10 SP3
elk11ES集群的节点之一10.0.0.11Kylin Linux Advanced Server V10 SP3
elk12ES集群的节点之一10.0.0.12Kylin Linux Advanced Server V10 SP3
elk13ES集群的节点之一10.0.0.13Kylin Linux Advanced Server V10 SP3

安装包准备

安装包名称描述
elasticsearch-7.17.29-x86_64.rpm每个节点都需要安装的ES软件包
filebeat-7.17.29-x86_64.rpm用于从主机读取数据的filebeat
kibana-7.17.29-x86_64.rpm用于展示存储在ES节点上的数据

配置文件准备

配置文件描述
elasticsearch.yml每个节点都需要安装的ES软件包
01-stdin-to-console.yaml用于从主机读取数据的filebeat
kibana.yml用于展示存储在ES节点上的数据

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
27
在/etc/ansible/roles/kibana/tasks下的main.yml书写剧本
[root@m01 kibana]#cat tasks/main.yml
---
# tasks file for kibana

- name: copy kibana package
copy:
src: kibana-7.17.29-x86_64.rpm
dest: /root/kibana-7.17.29-x86_64.rpm

- name: install kibana
yum:
name: /root/kibana-7.17.29-x86_64.rpm
disable_gpg_check: yes
state: present

- name: copy kibana config
copy:
src: kibana.yml
dest: /etc/kibana/kibana.yml

- name: enable and start kibana
service:
name: kibana
state: started
enabled: yes

filebeat

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
在/etc/ansible/roles/filebeat/tasks下的main.yml书写剧本
[root@m01 filebeat]#cat tasks/main.yml
---
# tasks file for filebeat

- name: copy filebeat package
copy:
src: filebeat-7.17.29-x86_64.rpm
dest: /root/filebeat-7.17.29-x86_64.rpm

- name: install filebeat
yum:
name: /root/filebeat-7.17.29-x86_64.rpm
disable_gpg_check: yes
state: present

- name: create filebeat config directory
file:
path: /etc/filebeat/config
state: directory

- name: copy filebeat config
copy:
src: 01-stdin-to-console.yaml
dest: /etc/filebeat/config/01-stdin-to-console.yaml

site.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@m01 roles]#cat site.yml
- hosts: elk
roles:
- es
- filebeat

- hosts: elk11
roles:
- kibana

ansible-playbook --syntax-check site.yml

ansible-playbook site.yml
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[root@m01 ansible]#tree roles
roles
├── es
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── elasticsearch-7.17.29-x86_64.rpm
│   │   └── elasticsearch.yml
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│   └── main.yml
├── es.yml
├── filebeat
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── 01-stdin-to-console.yaml
│   │   └── filebeat-7.17.29-x86_64.rpm
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│   └── main.yml
├── filebeat.yml
├── kibana
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── kibana-7.17.29-x86_64.rpm
│   │   └── kibana.yml
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│   └── main.yml
├── kibana.yml
└── site.yml

遇到的问题:

1
2
3
4
5
6
用 yum 替代 rpm(推荐)
yaml- name: install elasticsearch
yum:
name: /root/elasticsearch-7.17.29-x86_64.rpm
state: present # 已安装则跳过,不会报错
state: present 会自动判断是否已安装,已装则跳过,不报错。

十二.思维导图整理

ES集群部署及EFK架构梳理