一个刚接触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
スクリーンショット 2018-06-04 22.18.45.png

为了将nginx、fluentd、elasticsearch和kibana进行协同,每个组件都需要一定程度的了解,所以下面将简要介绍它们。

nginx 是一款开源的高性能HTTP和反向代理服务器,可用于提供静态和动态内容。它是一种轻量级、强大且可扩展的服务器软件。

简单来说,Nginx与Apache是相同的Web服务器。但是它们的内部实现有很大的区别。Apache采用多进程模型,在并发访问增加时,会通过启动进程数乘以堆大小来消耗内存,容易导致内存耗尽,并且响应变慢。这就是所谓的C10K(客户端1万台)问题。相比之下,Nginx采用了事件驱动模型,专注于处理并发访问,所以不会像Apache那样导致响应变慢。它通过单线程处理并发请求,避免了进程数增加的情况。仅凭这一点,似乎Nginx是唯一的选择,但是Apache也有它的优点,而Nginx也有它的缺点。相对于Nginx,Apache拥有更丰富的Web服务器功能,并且处理动态内容的速度较快。

由于智能手机的出现,访问网站的数量正在增加,所以了解nginx是一件不错的事情(不了解反而很糟糕…?)

流式处理软件Fluentd

这是一个用于数据收集管理的开源软件工具。 fluentd的特点是可以自定义数据的收集和记录目标。如果想要将数据文件传输或实时处理收集积累的数据,它是一个非常好的工具。这里所说的数据主要是指日志数据。通过使用插件,也可以收集Twitter等数据。

スクリーンショット 2018-06-07 23.59.38.png

作为一个形象的比喻,可以想象成上图的样子。Fluentd可以收集DB的日志、Linux的日志、Twitter的数据等,然后将其传递给Kafka、Hadoop、Elasticsearch、S3等等。

Fluentd具备以下功能:

    • input(fluentdに入れる・収集するデータ)

必要に応じてパースできる
タイムスタンプを管理が可能

output(fluentdが吐き出すデータ)

必要に応じてフォーマットできる

buffer(収集するデータを紛失しない仕組み)

データのやり取りでなにかエラーがあればリトライしてくれる
バッファはmemory bufferとfile bufferの2種類がある

memory bufferfile bufferバッファの場所メモリファイル処理速度早い遅い使用容量少ない(メモリ枯渇の可能性有)大きい(ディスク容量に依存)運用面運用しにくい運用しやすい

缓冲区具有上表中的特点。基本上,建议使用文件缓冲区。由于某种原因,如果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的配置中,部分代表了输入,而部分则代表了输出。
本次指定的配置。

souece設定値概要typetail入力をtailで読むformatltsvltsv形式としてファイル読み込み(加工するわけではない)path/var/log/nginx/access.log取り込むデータの場所tagnginxtailしたデータの吐き出す場所の指定pos_file/var/log/nginx/access.log.posどこまで読み込んだか記録しているposファイルを指定
match設定値概要typeelasticsearchfluent-plugin-elasticsearchプラグインで追加されたもので、elasticsearchに転送しますhostelasticsearch転送先のホストbuffer_typememoryメモリバッファを指定port9200転送先のポートindex_namefluentdelasticsearchでのindex名、logstash_formatがtrueの場合は、利用されないtype_namenginxelasticsearchのタイプ名logstash_formattruekibanaにlogstashフォーマットで出力するオプションlogstash_prefixnginx.accesskibanaに転送するデータのプレフィックス

根据源的标签来选择匹配的出口。匹配设置为。因此,通过源标签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
127.0.0.1_5601_app_kibana(Laptop with HiDPI screen).png
127.0.0.1_5601_app_kibana(Laptop with HiDPI screen) (1).png
127.0.0.1_5601_app_timelion(Laptop with HiDPI screen).png
127.0.0.1_5601_app_kibana(Laptop with HiDPI screen) (2).png

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

bannerAds