January 29, 2015

Fluentd + ElasticSearch + Kibana で nginx のログを可視化する

言わずと知れた fluentd + ElasticSearch + Kibana の組み合わせでデータの可視化を行う.

Kibana でグラフを描くところまでのメモを以下に記す.

必要な諸々をインストール

FreeBSD であれば必要なものは pkg に一通り揃っている.

% sudo pkg install rubygem-fluentd elasticsearch kibana

さらに fluentd から ElasticSearch にデータを渡すためのプラグインをインストールする.

% sudo fluent-gem install fluent-plugin-elasticsearch

次に,今インストールした諸々の設定を行う.

Fluentd

セットアップ

ホームディレクトリに設定ファイル等を作成する.

% fluentd --setup ./fluent
Installed ./fluent/fluent.conf.

動作確認

Fluentd を起動後, fluent-cat に debug.test タグを付けたメッセージを投げてみる.

% fluentd -c ./fluent/fluent.conf -vv &
% echo '{"json":"message"}' | fluent-cat debug.test

正常に動作していれば標準出力に下記のようなログが出力される.

2015-01-28 17:51:58 +0900 [trace]: plugin/in_forward.rb:189:initialize: accepted fluent socket from '127.0.0.1:12472': object_id=17199550480
2015-01-28 17:51:58 +0900 debug.test: {"json":"message"}
2015-01-28 17:51:58 +0900 [trace]: plugin/in_forward.rb:245:on_close: closed fluent socket object_id=17199550480

Nginx のログを扱う

動作確認ができたところで fluent.conf を記述する.

まずは nginx のログを標準出力してみる.

% vim fluent/fluent.conf
<source>
  type tail
  path /var/log/nginx-access.log
  pos_file /var/log/fluent/nginx-access.log.pos
  tag nginx.access
  format nginx
</source>

<match nginx.*>
  type stdout
</match>

fluent.conf に記述した pos_file を作成する.

% sudo mkdir /var/log/fluent
% sudo touch /var/log/fluent/nginx-access.log.pos

ここで nginx のログが標準出力されることを確認する.

% sudo fluentd -c ./fluent/fluent.conf -vv

動作確認ができたら fluent.conf を修正する.

Nginx のログを標準出力ではなく ElasticSearch に渡すようにする.

% vim fluent/fluent.conf
<match nginx.*>
  type elasticsearch
  logstash_format true
  host 503.mydns.jp
  port 9200
  index_name nginx
  type_name nginx
  flush_interval 10s
</match>

rc.conf の設定

% sudo vim /etc/rc.conf
fluentd_enable="YES"
fluentd_config=/home/nagi/fluent/fluent.conf

Fluentd の設定はここまで.次に ElasticSearch の設定を行う.

ElasticSearch

パスの設定

この設定は各人の環境に依存するため,人によってはデフォルト値で問題ない.

% sudo vim /usr/local/etc/elasticsearch/elasticsearch.yml
path.conf: /tank/usr/local/etc/elasticsearch
path.data: /tank/var/db/elasticsearch

上記のディレクトリを作成する.

% sudo mkdir /tank/usr/local/etc/elasticsearch
% sudo chown elasticsearch:elasticsearch /tank/usr/local/etc/elasticsearch
% sudo mkdir /tank/var/db/elasticsearch
% sudo chown elasticsearch:elasticsearch /tank/var/db/elasticsearch

rc.conf の設定

% sudo vim /etc/rc.conf
elasticsearch_enable="YES"

ポート開放

ElasticSearch ではデフォルトで 9200 番ポートが使用される.

下記のポート開放手順は各人の環境に合わせて読み替えのこと.

% sudo vim /etc/ipfw.rules
$IPF 220 allow tcp from any to any 9200 in
$IPF 230 allow tcp from any to any 9200 out

% sudo /etc/rc.d/ipfw restart

ElasticSearch の設定はここまで.次に Kibana の設定を行う.

Kibana

必要に応じて Kibana のディレクトリをコピーする.

デフォルトのロケーションで動作させる場合にはこの手順は不要である.

% sudo cp -a /usr/local/www/kibana /tank/www/
% sudo chown -R nagi:www /tank/www/kibana

nginx の設定

Nginx に Kibana のディレクトリ等の情報を設定する.

% sudo vim /tank/usr/local/etc/nginx/conf.d/503.mydns.jp.conf
server {
    listen      80;
    server_name k.503.mydns.jp;
    location / {
        root    /tank/www/kibana;
        index   index.html;
    }
}

ElasticSearch の設定

ElasticSearch が動作しているホストとポートを設定する.

%vim /tank/www/kibana/config.js
    elasticsearch: "http://503.mydns.jp:9200",

Kibana の設定はここまで.

以上で最低限の設定は終わったため,実際に動作させてみる.

データ可視化

rc script の起動

% sudo /usr/local/etc/rc.d/elasticsearch start
% sudo /usr/local/etc/rc.d/fluentd start
% sudo /usr/local/etc/rc.d/nginx restart

Kibana

Kibana にアクセスしたところ, Connection Failed と叱られた.

Error Connection Failed

メッセージに従い elasticsearch.yml を修正し, ElasticSearch を再起動してアクセスすると,今度は上手くいった.

% sudo vim /usr/local/etc/elasticsearch/elasticsearch.yml
################################ Kibana ################################
http.cors.enabled: true

% sudo /usr/local/etc/rc.d/elasticsearch restart

Top Kibana 正常動作時のトップページ

Logstash Dashboard にアクセスすると,以下のようにデータが可視化された.

Visualization データ可視化サンプル

終わりに

とりあえず fluentd + ElasticSearch + Kibana による可視化の第一歩を踏み出せた.どのようなデータを収集するか,そしてどのような観点で分析するかといったことは,今後少しずつ考えていく.