CentOSでNginxのログをFluentdを使ってMongodbにリアルタイムで格納する
- 作者: Clement Nedelcu,長尾高弘
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2011/04/21
- メディア: 大型本
- 購入: 2人 クリック: 714回
- この商品を含むブログ (23件) を見る
このエントリーで試したいこと
Nginxのログをfluentdを使ってMongoDBに格納することをリアルタイムで行うことを試してみたいと思います。参考にしたサイトは以下のものです。
fluentd
- Fluentdのドキュメントへようこそ ― fluentd 0.10 documentation
- Fluentdで始めるリアルタイムでのログ有効活用 (1/4):CodeZine
- Introduction of ‘fluentd’ « NAVER Engineers' Blog
- fluentd を利用した大規模ウェブサービスのロギング
- dstatの結果をfluentdで取得して、WebSocketで送りつけるリアルタイムリソース監視アプリを作ってみた。 - from scratch
- #fluentd でアクセスログからメトリクス生成/リアルタイム監視するための設定例 - tagomorisのメモ置き場
Nginxの導入
install
Nginxをyumコマンドでinstallします。
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm $ sudo yum install nginx -y $ yum installed list | grep nginx nginx.x86_64 1.2.7-1.el6.ngx @nginx nginx-release-centos.noarchLogFormatをApacheと同じにする
NginxのDefaultLogFormatはApacheと異なります。/etc/nginx/nginx.confを修正してApacheと同じLogFormatに変更します。
$ sudo vim /etc/nginx/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }Nginx起動
Nginxの設定ファイルのsyntax確認をしたあとに起動をします。
$ sudo /etc/init.d/nginx configtest nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo /etc/init.d/nginx startNginxのプロセスと起動確認
psコマンドでプロセス、w3mでhtmlを読み込めるか確認します。
$ ps auxww | grep nginx root 1821 0.0 0.0 44644 104 ? Ss 10:39 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 1823 0.0 0.0 45052 896 ? S 10:39 0:00 nginx: worker process $ w3m "http://localhost:80" Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.
MongoDBの導入
Install
yum.repos.d以下に10gen.repoを追加してyum installします。
$ sudo vim /etc/yum.repos.d/10gen.repo //記述内容 [10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=0 $ sudo yum --enablerepo=10gen install mongo-10gen-server.x86_64 -y Installed: mongo-10gen-server.x86_64 0:2.2.3-mongodb_1 Dependency Installed: mongo-10gen.x86_64 0:2.2.3-mongodb_1 Complete!Mongdbの起動とプロセス確認
serviceコマンドで起動します。プロセスの確認はpsで行います。
$ sudo /sbin/service mongod start Starting mongod: forked process: 3413 all output going to: /var/log/mongo/mongod.log child process started successfully, parent exiting [ OK ] $ ps auxww | grep mongod mongod 3413 6.5 3.0 150336 30068 ? Sl 11:37 0:04 /usr/bin/mongod -f /etc/mongod.conf
Fluentd
Install
yum.repos.d以下にtd.repoを追加してyum installできるようにします。
$ sudo vim /etc/yum.repos.d/td.repo [treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0 $ sudo yum install td-agent -y Installed: td-agent.x86_64 0:1.1.11-0 Dependency Installed: compat-libtermcap.x86_64 0:2.0.8-49.el6 compat-readline5.x86_64 0:5.2-17.1.el6 openssl098e.x86_64 0:0.9.8e-17.el6.centos.2 td-libyaml.x86_64 0:0.1.4-1 Complete!Td-agentの設定ファイル修正
/etc/td-agent/td-agent.confを修正してNginxのLogをMongodbに格納するように指定します。設定の意味はsourceがLogFileに関する設定、matchが条件に一致したLogを扱う設定を書いています。ここではmongodbに格納したいので、typeをmongo、databaseにnginx、扱うテーブルにnginx_accessとしています。sourceのformatをnginxと指定出来れば簡単なのですが、nginxを指定してもダメなようです。この記事ではnginxのLogFormatをApacheと同じにしているのでformat apacheとしましたが、nginxのLogFormatをそのまま使いたい場合は、正規表現で指定することもできます。(例) format /^(?[^ ]*) [^ ]* (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^ ]*) +\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)" (?[^ ]*))?$/
<source> type tail format apache path /var/log/nginx/access.log tag nginx.access </source> <match nginx.access> type mongo host localhost database nginx collection nginx_access port 27017 flush_interval 10s </match>fluent-plugin-mongo install
Fluentd経由でLogをMongodbに格納するためのpluginをinstallします。
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mongo Fetching: fluent-plugin-mongo-0.6.13.gem (100%) Successfully installed fluent-plugin-mongo-0.6.13 1 gem installed Installing ri documentation for fluent-plugin-mongo-0.6.13... Installing RDoc documentation for fluent-plugin-mongo-0.6.13...fluentd 起動
$ sudo /sbin/service td-agent start Starting td-agent: [ OK ]
Mongodbのデータを確認
Logの確認
NginxのAccessLogがリアリタイムでMongodbに格納されているかを見てみます。上で指定した通りにnginxというdatabaseのnginx_accessというtableにデータが格納されていることが分かります。Mongodbなのでbson(json)形式でのデータ格納になります。
$ mongo MongoDB shell version: 2.2.3 connecting to: test > show dbs; local (empty) nginx 0.203125GB > use nginx switched to db nginx > show collections nginx_access system.indexes > db.nginx_access.find() { "_id" : ObjectId("5123476fe138231086000001"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "612", "referer" : "-", "agent" : "w3m/0.5.2", "time" : ISODate("2013-02-19T09:35:35Z") } { "_id" : ObjectId("51234790e138231086000002"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "612", "referer" : "-", "agent" : "w3m/0.5.2", "time" : ISODate("2013-02-19T09:36:14Z") }