【一足遅れで】さくらVPSのアクセスログをMetabaseで可視化してみるメモ

今更な話題ですが、ApacheからNginxへWebサーバを移行したので、
ついでにログの可視化とか色々試してみたのでそのメモです。

■環境

  • さくらVPS(1Gプラン)・・・memory足りてません
  • CentOS release 6.8環境
  • NGINX+MySQL+PHP-FPM
  • td-agent は、0.12.40 で実装(書式が変わってます。)

■実装方針

  • アクセスログは、td-agent(Fluentd) でMySQLに保存する。
  • ログの可視化は、Metabaseで行う。
  • Nginxはすでに運用中の想定(構築範囲に含めない)
  • Nginxのアクセスログは、ltsv形式

■構築メモ

(1) td-agentの導入

curlで持ってくるだけですね。

# curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

・バージョン確認とか
# /opt/td-agent/usr/sbin/td-agent --version
td-agent 0.12.40

# /usr/sbin/td-agent-gem -v
2.6.13

(2) Plugin導入

・インストールするpluginの確認
# /usr/sbin/td-agent-gem search -r fluent-plugin-mysql
*** REMOTE GEMS ***
fluent-plugin-mysql (0.3.4)
fluent-plugin-mysql-appender (0.5.1)
fluent-plugin-mysql-binlog (0.0.2)
fluent-plugin-mysql-bulk (0.0.8)
fluent-plugin-mysql-fetch-and-emit (0.1.0)
fluent-plugin-mysql-load (0.0.2)
fluent-plugin-mysql-prepared-statement (0.0.5)
fluent-plugin-mysql-query (1.0.1)
fluent-plugin-mysql-replicator (0.6.1)
fluent-plugin-mysql-select-insert (0.1.0)
fluent-plugin-mysql-status (0.0.1)
fluent-plugin-mysql_explain (0.0.1)
fluent-plugin-mysqlrecord (0.0.1)
fluent-plugin-mysqlslowquery (0.0.9)
fluent-plugin-mysqlslowquerylog (0.0.3)
fluent-plugin-mysqlslowquerylog-ippen-digital (0.0.6)

# scl enable devtoolset-6 bash #devtoolsetを入れている場合

・インストール
# /usr/sbin/td-agent-gem install fluent-plugin-mysql

※エラー内容に応じてmysql-develとか入れる。
# yum install mysql-devel

(3)コンフィグを書く

td-agent.confを構成するために、Nginxのアクセスログの書式を確認する。
この環境ではLTSV形式に変更しています。(この方が扱いが楽なため)

# cat /etc/nginx/nginx.conf
log_format ltsv 
  "time:$time_local\t"
  "time_local:$time_iso8601\t"
  "host:$remote_addr\t"
  "status:$status\t"
  "method:$request_method\t"
  "uri:$request_uri\t"
  "protocol:$server_protocol\t"
  "req:$request\t"
  "size:$body_bytes_sent\t"
  "referer:$http_referer\t"
  "ua:$http_user_agent\t"
  "reqtime:$request_time\t"
  "vhost:$host";
access_log /var/log/nginx/access.log ltsv;

この内容td-agent.conf を記載します。
databaseあたりは、mysqlの投入したいDB名に合わせる感じで。
(今回はDB名:hogehoge 、Table名:access_logと仮定)

# cat /etc/td-agent/td-agent.conf

####
## Source descriptions:
##

<source>
  @type tail
  format ltsv
  time_key time
  time_format %d/%b/%Y:%H:%M:%S %z
  
  tag nginx.access
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
</source>

<match nginx.access>
  @type copy
  <store>
    @type mysql_bulk
    host localhost
    database hogehoge
    username hogehoge
    password xxxxx

    key_names time_local,host,status,method,uri,protocol,req,size,referer,ua,reqtime,vhost
    column_names time_local,host,status,method,uri,protocol,req,size,referer,ua,reqtime,vhost
    sql INSERT INTO access_log(time_local,host,status,method,uri,protocol,req,size,referer,ua,reqtime,vhost) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)

    table access_log
    flush_interval 10s
  </store>
  <store>
    type file
    path /var/log/td-agent/request.json
  </store>
</match>

「/var/log/nginx/access.log」はそのままだと読み込み権限がないので、
読み込み権限をつける事。

logrotatedとかでログローテートした後に権限が戻るので、そっちもちゃんと
手当する。

・暫定対処
# chmod +r /var/log/nginx/access.log

・logrotateの設定ファイルも「create」の部分を644とかに変える。
# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 644 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

(4) MySQLにデータベースを作成する。

横が長すぎて読めないのはsource表示のボタン押してみて下さい・・。
(themeそのうち変えます)

mysql> CREATE TABLE `access_log` (
> `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
> `time_local` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
> `host` varchar(128) DEFAULT NULL COMMENT 'Remote IP Addres',
> `status` varchar(5) DEFAULT NULL COMMENT 'Status code',
> `method` varchar(10) DEFAULT NULL COMMENT 'Request method',
> `uri` varchar(500) DEFAULT NULL COMMENT 'Request URI',
> `protocol` varchar(10) DEFAULT NULL COMMENT 'Requested Protocol (usually HTTP/1.0 or HTTP/1.1)',
> `req` varchar(500) DEFAULT NULL COMMENT 'First line of request',
> `size` int(10) unsigned DEFAULT NULL COMMENT 'Size of response in bytes, excluding HTTP headers.',
> `referer` varchar(255) DEFAULT NULL COMMENT 'Referer header',
> `ua` varchar(255) DEFAULT NULL COMMENT 'User-Agent header',
> `reqtime` float unsigned DEFAULT NULL COMMENT 'request time',
> `vhost` varchar(50) DEFAULT NULL COMMENT 'Host header',
> PRIMARY KEY (`id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 2 warnings (0.04 sec)


mysql> show columns from access_log;
+------------+---------------------+------+-----+---------------------+----------------+
| Field      | Type                | Null | Key | Default             | Extra          |
+------------+---------------------+------+-----+---------------------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| time_local | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| host       | varchar(128)        | YES  |     | NULL                |                |
| status     | varchar(5)          | YES  |     | NULL                |                |
| method     | varchar(10)         | YES  |     | NULL                |                |
| uri        | varchar(500)        | YES  |     | NULL                |                |
| protocol   | varchar(10)         | YES  |     | NULL                |                |
| req        | varchar(500)        | YES  |     | NULL                |                |
| size       | int(10) unsigned    | YES  |     | NULL                |                |
| referer    | varchar(255)        | YES  |     | NULL                |                |
| ua         | varchar(255)        | YES  |     | NULL                |                |
| reqtime    | float unsigned      | YES  |     | NULL                |                |
| vhost      | varchar(50)         | YES  |     | NULL                |                |
+------------+---------------------+------+-----+---------------------+----------------+

13 rows in set (0.00 sec)

ここまででMySQLへのアクセスログの流し込みに必要な設定は完了です。
Agentを起動して無事に起動出来れば、DBへの流し込みも出来ていると思います。

/etc/init.d/td-agent start

(6)Metabaseのインストール(ダウンロード)と設定

# wget http://downloads.metabase.com/v0.31.2/metabase.jar

でダウンロードしたら、Curlでそのまま実行。

とりあえずHeapは512Mbyte割り当ててますが、Heapエラーが出る場合は、
1Gとかに変えてみましょう(さくらVPS上での実行を断念)

# java -Xmx512m -jar metabase.jar

ログが流れて「http://localhost:3000/setup/」の表示が出たら、
ブラウザから「http://localhost:3000/setup/」へアクセスすれば、
初期設定画面が出ます。

Metabaseの設定画面は直感で設定出来ると思います。
初期ユーザ登録して、Databaseの追加をして‥という流れです。

試しにアクセス数をグラフにしたもの。

ちなみにさくらVPSの1Gプランだと、メモリー不足になったので、
今は、MySQLを自宅からの接続許可して自分のPCでMetabse起動してログ監視しています。

今後は、Raspberry piで動かそうかなと思ってはいますが・・・



コメントする

メールアドレスが公開されることはありません。