Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

CentOSでNginxのログをFluentdを使ってMongodbにリアルタイムで格納する

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門

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.noarch
LogFormatを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 start
Nginxのプロセスと起動確認

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.
Log確認

アクセスログは/var/log/nginx/access.logに格納されます。error.logも同じディレクトリに生成されます。

cat /var/log/nginx/access.log
127.0.0.1 - - [19/Feb/2013:18:35:35 +0900] "GET / HTTP/1.0" 200 612 "-" "w3m/0.5.2"
127.0.0.1 - - [19/Feb/2013:18:36:14 +0900] "GET / HTTP/1.0" 200 612 "-" "w3m/0.5.2"

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") }
Logの活用

Mondbのdb.nginx_access.find()の条件に例えばCookieやSessionIDのようなものを指定して、AccessUserの行動履歴をリアルタイムで追うことが出来るような仕組みを設けておくとログ解析する人は大変重宝されると思います。