dockerなら5分で動く! nginxのログをfluentdで集めてnorikraでストリーム分析


はじめに

ようへいさんのポストを参考にしてdocker上でnginxとfluentdとnorikraを動かせたので、docker indexにイメージを掲載した。dockerのある環境ならあっという間に動くはず。

準備

手順

norikraを動かす

まずはログの集約先となるnorikraを動かす。

$ sudo docker run -p 26578:26578 -p 26571:26571 -p 24224:24224 -p 24224:24224/udp -d kazunori279/fluentd-norikra-server

初回はイメージのダウンロードにちょっと時間がかかる。終わったら、norikraを載せたコンテナがちゃんと動いているか、docker psで確認。

$ sudo docker ps
CONTAINER ID        IMAGE                                       COMMAND                CREATED             STATUS              PORTS                                                                                                    NAMES
7874efdd2e06        kazunori279/fluentd-norikra-server:latest   /bin/sh -c /etc/init   16 minutes ago      Up 16 minutes       0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, 0.0.0.0:26571->26571/tcp, 0.0.0.0:26578->26578/tcp   grave_turing

加えて、ブラウザからnorikraのWeb UIを開いてみる。URLはhttp://<dockerホストのIP>:26578/#となる。

動いてる動いてる。ちなみに、この時点ですでにfluentd(td-agent)とfluent-plugin-norikraも利用可能な状態なので、norikraの準備はこれで終わり。docker簡単すぎてすごい。

nginxを動かす

norikraにログを流すnginxを用意しよう。別マシン上で動かしてもいいし、同じマシン上で動かしてもいい。

sudo docker run -d -e NORIKRA_IP=<norikraが動いているマシンのIP> -p 80:80 kazunori279/fluentd-nginx

これも初回はイメージのダウンロードが行われる。なお、このnginxとnorikraの間ではfluentdによるUDP通信が必要なので、例えばGoogle Compute Engineを使う場合はNORIKRA_IPとしてInternal IPを指定する必要がある。

では、nginxのコンテナを確認してみよう。

$ sudo docker ps
CONTAINER ID        IMAGE                                       COMMAND                CREATED             STATUS              PORTS                                                                                                    NAMES
9d694d33b77d        kazunori279/fluentd-nginx:latest            /bin/sh -c sed -e "s   13 minutes ago      Up 13 minutes       0.0.0.0:80->80/tcp                                                                                       thirsty_torvalds

いい感じ。このイメージにはnginxとfluentdが含まれていて、上記コマンドのNORIKRA_IPで指定したマシン上のnorikraにすべてのログが転送される設定になっている。

curlでnginxを何回か叩いてみる。

$ curl http://localhost/
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>

ここで、ブラウザからnorikraのWeb UIをリロードして、ログが届いてるか見てみよう。

きてるきてる。Targetsshow fieldsをクリックすると、nginx_accessというターゲットが自動作成されてフィールドも正しく認識されているのがわかる。

SQLを試す

せっかくなので、SQLを試してみよう。Web UIからQuerieseditorをクリックして、以下の様なSQLを入力。

select * from nginx_access where path like '%foo%'

これはURI上に文字列fooが含まれるログのみを集める、という意味。Add Queryボタンをクリックしたら、curl http://localhost/?foo=barのようにfooをURLに含めて再度アクセスしてみる。

うまいこと集計されてるね! 再起動しなくても実行中にクエリをいろいろ追加・修正できるし、すべてがオンメモリだから速そう。norikraいいね! dockerと組み合わせるととても快適だ。これからnorikra用のダッシュボードUIをどうしようか考え中。

References