一つのサービスで、負荷分散のために複数のWebサーバ(nginx)を運用している場合、アクセスログなどがバラバラに散らばっていて、ログからなにか調べようと思ったり、統計をとったりするのが面倒だったりします。
そこで、ここ最近はやっているfluentdを導入してみました。うわさ通り簡単。
イメージはこんな感じ。
fluentdのインストール
ログを送信する側と、受信する側、両方にfluentdが入っている必要があります。
今回はAWSのディストリだったので、yum経由でインストール。公式サイトに記載されている下記コマンド一発で完了です。他にもapt-get / gem / brewでも簡単に入れられます。
curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh
Installing Fluentd Using rpm Package | Fluentd
起動や停止は自動的にサービス化されています。
service td-agent start | stop | restart | status
nginxのログを送信する
/etc/td-agent/td-agent.conf
<source>
type tail
path /var/log/nginx/access.log
format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)") (?<requesttime>[^ ]*)?/
time_format %d/%b/%Y:%H:%M:%S %z
tag nginx.access
pos_file /var/log/td-agent/nginx.pos
</source>
<match nginx.access>
type forward
buffer_type memory
buffer_chunk_limit 256m
buffer_queue_limit 128
flush_interval 5s
<server>
# ログの送信先IPアドレス
host 192.168.1.100
port 24224
</server>
</match>
ログファイルのフォーマットに関しては、apacheなどのプリセットされているものもありますが、正規表現を使ってオリジナルフォーマットに対応させることも出来ます。
今回は、nginxのログフォーマットを改造しているので、独自のフォーマットとして登録します。
nginxのログを受信する
上記サーバで type forward と設定したので、収集したログは外部サーバへ投げるようになっています。投げる先は例だと 192.168.1.100 になります。
ポートはデフォルトだと24224のTCP/UDPを使います。データ送信はTCP、サーバの死活監視用にUDPを使うみたいです。
/etc/td-agent/td-agent.conf
<source>
type forward
port 24224
</source>
<match nginx.access>
type file
path /var/log/td-agent/access_log
</match>
まず、物理ファイルに出力する設定です。これで基本的には設定完了。あとはtd-agentを起動すれば動き出すはず。/var/log/td-agent/access_log に対して、どんどんログが追記されてくると思います。
ログの出力タイミングは flush_interval で調整できます。デフォルトだと60秒だった…かな。今は5秒くらいでやっていますが、特に問題なく動いています。
mongoDBのインストール
物理ファイルじゃなくて、mongoDBに突っ込んで色々やりたいので、インストールしてみます。yumでインストールするために、リポジトリを登録します。
/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
そしてyumでインストール。
sudo yum -y install mongo-10gen mongo-10gen-server
fluentdのプラグインも必要なので下記コマンドでインストール。
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mongo
mongoDBの起動。
sudo service mongod start
fluentdの出力先をmongoDBに変更する
ログ受信サーバ側の fluentd の設定を下記のように変更します。
<source>
type forward
port 24224
</source>
<match nginx.access>
type mongo
database nginx
collection access
host 127.0.0.1
port 27017
</match>
これで td-agent を再起動すれば、mongoDBにデータが溜まるはず。
$ mongo
> use nginx
> db.access.find()
こんな感じでデータが見られると思います。今回はじめてmongoDBを使いましたが、すごいサクサク。ココらへんももっと勉強しないとなー。