一个刚接触Docker的初学者尝试使用 fluentd + elasticsearch + kibana 将Nginx的日志数据可视化
由于对Docker等虚拟技术的了解非常有限,我参加了《Java工程师的Docker入门-虚拟开发测试环境构建》的JJUG CCC 2018春季研讨会,稍微学习了一下,尝试使用Docker搭建了环境。在《重新了解Docker入门-容器化有何好处》的基础上,我尝试使用fluentd + elasticsearch + kibana将Nginx日志可视化。顺便提一下,我对fluentd、elasticsearch和kibana只是听说过,从未实际使用过,几乎没有任何预备知识,所以可能存在一些错误。
环境
-
- macOS
- Docker for Mac Version 2.0.0.0-mac81 (Docker)
制作物
收集nginx的日志,并使用kibana对访问情况进行可视化。本次只需简单设置,进行可视化。具体操作是使用fluentd收集nginx的日志,并将其存储到elasticsearch中。然后,根据存储的数据在kibana中进行可视化。
做好的东西 (zuò de
请查看 git。
克隆后,执行 docker-compose build,然后使用 docker-compose up -d 启动。
执行命令应该是像这样。首次构建需要一些时间。
$ docker-compose build
Building elasticsearch
Step 1/1 : FROM elasticsearch:5.6
---> 671bb2d7da44
Successfully built 671bb2d7da44
Successfully tagged nginx-monitoring_elasticsearch:latest
Building fluentd
Step 1/2 : FROM fluent/fluentd:v1.3.2-1.0
---> 2b942cd70a7f
Step 2/2 : RUN gem install fluent-plugin-elasticsearch
---> Using cache
---> fb7ab6e052b3
Successfully built fb7ab6e052b3
Successfully tagged nginx-monitoring_fluentd:latest
Building nginx
Step 1/1 : FROM nginx:1.15.8
---> 02256cfb0e4b
Successfully built 02256cfb0e4b
Successfully tagged nginx-monitoring_nginx:latest
Building kibana
Step 1/1 : FROM kibana:5.6.14
---> 4e429ed92aeb
Successfully built 4e429ed92aeb
Successfully tagged nginx-monitoring_kibana:latest
$ docker-compose up -d
Creating network "nginx-monitoring_default" with the default driver
Creating nginx-monitoring_elasticsearch_1 ... done
Creating nginx-monitoring_fluentd_1 ... done
Creating nginx-monitoring_kibana_1 ... done
Creating nginx-monitoring_nginx_1 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
576dd2bce127 nginx-monitoring_nginx "nginx -g 'daemon of…" 9 seconds ago Up 14 seconds 0.0.0.0:8090->80/tcp nginx-monitoring_nginx_1
ab084c4416a3 nginx-monitoring_kibana "/bin/sh -c /usr/loc…" 10 seconds ago Up 15 seconds 0.0.0.0:5601->5601/tcp nginx-monitoring_kibana_1
ef28ec21fe2b nginx-monitoring_fluentd "/bin/entrypoint.sh …" 10 seconds ago Up 15 seconds 5140/tcp, 0.0.0.0:24224->24224/tcp nginx-monitoring_fluentd_1
2550dc320be2 nginx-monitoring_elasticsearch "/bin/bash bin/es-do…" 11 seconds ago Up 16 seconds 0.0.0.0:9200->9200/tcp, 9300/tcp nginx-monitoring_elasticsearch_1

为了将nginx、fluentd、elasticsearch和kibana进行协同,每个组件都需要一定程度的了解,所以下面将简要介绍它们。
nginx 是一款开源的高性能HTTP和反向代理服务器,可用于提供静态和动态内容。它是一种轻量级、强大且可扩展的服务器软件。
简单来说,Nginx与Apache是相同的Web服务器。但是它们的内部实现有很大的区别。Apache采用多进程模型,在并发访问增加时,会通过启动进程数乘以堆大小来消耗内存,容易导致内存耗尽,并且响应变慢。这就是所谓的C10K(客户端1万台)问题。相比之下,Nginx采用了事件驱动模型,专注于处理并发访问,所以不会像Apache那样导致响应变慢。它通过单线程处理并发请求,避免了进程数增加的情况。仅凭这一点,似乎Nginx是唯一的选择,但是Apache也有它的优点,而Nginx也有它的缺点。相对于Nginx,Apache拥有更丰富的Web服务器功能,并且处理动态内容的速度较快。
由于智能手机的出现,访问网站的数量正在增加,所以了解nginx是一件不错的事情(不了解反而很糟糕…?)
流式处理软件Fluentd
这是一个用于数据收集管理的开源软件工具。 fluentd的特点是可以自定义数据的收集和记录目标。如果想要将数据文件传输或实时处理收集积累的数据,它是一个非常好的工具。这里所说的数据主要是指日志数据。通过使用插件,也可以收集Twitter等数据。

作为一个形象的比喻,可以想象成上图的样子。Fluentd可以收集DB的日志、Linux的日志、Twitter的数据等,然后将其传递给Kafka、Hadoop、Elasticsearch、S3等等。
Fluentd具备以下功能:
-
- input(fluentdに入れる・収集するデータ)
必要に応じてパースできる
タイムスタンプを管理が可能
output(fluentdが吐き出すデータ)
必要に応じてフォーマットできる
buffer(収集するデータを紛失しない仕組み)
データのやり取りでなにかエラーがあればリトライしてくれる
バッファはmemory bufferとfile bufferの2種類がある
缓冲区具有上表中的特点。基本上,建议使用文件缓冲区。由于某种原因,如果fluentd本身停止运行,文件缓冲区将作为文件保留,使得检查更加方便。处理速度相对于内存缓冲区较慢,只有在必须严密关注I/O时间的情况下,才会选择使用内存缓冲区并承担内存耗尽的风险。但需要注意的是,默认设置是使用内存缓冲区。因此,必要时需要修改缓冲区设置。
弹性搜索
elasticsearch是由elastic公司开发的开源全文搜索引擎(分布式RESTful搜索/分析引擎)。它不像关系型数据库那样可以使用SQL进行数据操作,而是使用RESTful API进行操作。因此,可以在各种语言中进行操作。elasticsearch主要负责数据的存储和搜索,可视化和安全等方面使用了相关的系统集合,称为Elastic Stack。Elastic Stack包括elasticsearch、kinaba、Logstash、Beats、X-Pack和ECE等组件。由于本次内容不太复杂,因此不会进行太多解释。
Kibana 可视化平台
您可以使用各种格式对存储在elasticsearch中的数据进行可视化。此外,您还可以对存储在elasticsearch中的数据进行搜索。
直到日志的可视化
构成
.
├── docker-compose.yml
├── elasticsearch
│ └── Dockerfile
├── fluentd
│ ├── Dockerfile
│ └── config
│ └── fluent.conf
├── kibana
│ └── Dockerfile
└── nginx
├── Dockerfile
├── config
│ └── nginx.conf
└── html
├── index.html
└── test.html
version: "3.3"
services:
nginx:
build: ./nginx
volumes:
- ./nginx/config/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
- ./nginx/html:/usr/share/nginx/html
ports:
- 8090:80
links:
- fluentd
fluentd:
build: ./fluentd
volumes:
- ./fluentd/config:/fluentd/etc
- ./nginx/log:/var/log/nginx
links:
- elasticsearch
ports:
- "24224:24224"
depends_on:
- elasticsearch
elasticsearch:
build: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
kibana:
build: kibana
ports:
- "5601:5601"
links:
- elasticsearch:elasticsearch
volumes:
esdata:
driver: local
FROM elasticsearch:5.6.14
# RUN elasticsearch-plugin remove x-pack
在Elasticsearch 5.6.4版本之前,如果直接使用Elasticsearch的映像,由于其中包含了x-pack,因此需要将其删除。x-pack是一款付费工具,需要使用许可证密钥,因此需要删除或禁用它。但在5.6.14版本中,似乎不再需要删除。
FROM fluent/fluentd:v1.3.2-1.0
RUN gem install fluent-plugin-elasticsearch
这次我们要安装 fluent-plugin-elasticsearch,以便将数据通过 fluentd 发送到 elasticsearch。
<source>
type tail
format ltsv
path /var/log/nginx/access.log
tag nginx
pos_file /var/log/nginx/access.log.pos
</source>
<match nginx>
type elasticsearch
host elasticsearch
buffer_type memory
port 9200
index_name fluentd
type_name nginx
logstash_format true
logstash_prefix nginx.access
</match>
在Fluentd的配置中,部分代表了输入,而部分则代表了输出。
本次指定的配置。
根据源的标签来选择匹配的出口。匹配设置为。因此,通过源标签nginx收集的数据将被分配到作为传输目标。还可以设置多个出口。
<source>
tag hoge.foo
・・・
</source>
<source>
tag hoge.huga
・・・
</source>
# tag hoge.fooの出口
<match hoge.foo>
・・・
</match>
# tag hoge.fooとtag hoge.hugaの両方の出口
<match hoge.**>
・・・
</match>
FROM kibana:5.6.14
# RUN kibana-plugin remove x-pack
在Kibana 5.6.4版本中,删除x-pack是必要的,但在5.6.14版本中似乎不再需要。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 他のファイルから設定読み込み
# mime.types : MIMEタイプと拡張子の関連付けを定義したファイル
include /etc/nginx/mime.types;
# レスポンスのデフォルトMIMEタイプ設定
default_type application/octet-stream;
# アクセスログの書式設定(ltsv)
log_format ltsv 'time:$time_iso8601\t'
'remote_addr:$remote_addr\t'
'request_method:$request_method\t'
'request_length:$request_length\t'
'request_uri:$request_uri\t'
'https:$https\t'
'uri:$uri\t'
'query_string:$query_string\t'
'status:$status\t'
'bytes_sent:$bytes_sent\t'
'body_bytes_sent:$body_bytes_sent\t'
'referer:$http_referer\t'
'useragent:$http_user_agent\t'
'forwardedfor:$http_x_forwarded_for\t'
'request_time:$request_time\t'
'upstream_response_time:$upstream_response_time\t'
'host:$host';
# アクセスログの出力先
access_log /var/log/nginx/access.log ltsv;
# コンテンツのファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかを設定
# デフォルトは off
sendfile on;
include /etc/nginx/conf.d/*.conf;
}
FROM nginx:1.15.8




在不同的浏览器中随意访问并创建日志,然后将其注册到仪表板上进行图表化,就完成了可视化。相比于查看日志文件,明显可视化更易于阅读和理解信息。