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


# はじめに
[ようへいさんのポスト](http://inokara.hateblo.jp/entry/2013/12/29/060324)を参考にしてdocker上でnginxとfluentdとnorikraを動かせたので、[docker indexにイメージを掲載した](https://index.docker.io/u/kazunori279/)。dockerのある環境ならあっという間に動くはず。

# 準備
* [dockerが動く](http://knowledge.sakura.ad.jp/tech/1811/?utm_source=dlvr.it&utm_medium=twitter)こと
* ホスト側で[fluentd用のファイルディスクリプタ設定](http://qiita.com/kazunori279/items/5aedb6ed548225545a3c)を済ませていること

# 手順
## 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/#`となる。

![Screen Shot 2014-03-02 at 9.49.45 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/75c3f0ac-992a-4dc2-0fc1-5dd5a1d17356.png "Screen Shot 2014-03-02 at 9.49.45 AM.png")

動いてる動いてる。ちなみに、この時点ですでに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をリロードして、ログが届いてるか見てみよう。

![Screen Shot 2014-03-02 at 9.57.45 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/e4fd4ffb-26e3-f83b-fd83-e6ed81722138.png "Screen Shot 2014-03-02 at 9.57.45 AM.png")

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

![Screen Shot 2014-03-02 at 10.00.53 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/e4f0e149-8e83-1400-1a45-7b113d6276f6.png "Screen Shot 2014-03-02 at 10.00.53 AM.png")

## SQLを試す

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

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

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

![Screen Shot 2014-03-02 at 10.13.51 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38290/8560b126-bc45-fdd4-a43d-56c2e6ac4be5.png "Screen Shot 2014-03-02 at 10.13.51 AM.png")

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

# References
* [norikra を試す](http://inokara.hateblo.jp/entry/2013/12/29/060324)
* kazunori279/fluentd-norikra-serverの[Dockerfile](https://github.com/kazunori279/dockerfiles/blob/master/fluentd-norikra-server/Dockerfile)
* kazunori279/fluentd-nginxの[Dockerfile](https://github.com/kazunori279/dockerfiles/blob/master/fluentd-nginx/Dockerfile)