今更な話題ですが、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で動かそうかなと思ってはいますが・・・