先日準備したElasticsearchの上にkibanaを構築していく。kibanaで手軽にwordpressのアクセス状況を解析したい。手癖の悪いクローラーがDoS攻撃のようになって、レスポンスタイムが著しく遅くなったことがあった。一見するとサーバ側には何も問題が起きていないため、逆に原因を特定しづらい。こういうときに、HTTPステータス数やIPアドレスごとのレスポンスタイムを集計したグラフがあったりすると、すぐに問題を判別できる。無名のクローラーなんて全部拒否っちゃえばいいんだけどね。
環境はいつも通りのCentOS7。lxcで切り分けたコンテナ上で作業しているけど、物理OSでもあまりやることは変わらないはず。kibanaのインストールは非常に簡単で、公式からダウンロードしてrpmで入れるだけ。設定ファイルは/etc/kibana/kibana.yml。あまり書くことはなく、Elasticsearchがremoteの場合はそのURLを書くくらい。うちはkeepalivedで張っているVIP側もLISTENして欲しかったので、server.hostの設定を加えておいた。具体的には以下のような感じ。
yum install -y https://artifacts.elastic.co/downloads/kibana/kibana-5.5.0-x86_64.rpm
vi /etc/kibana/kibana.yml
:
server.host: 0.0.0.0
elasticsearch.url: "http://es:9200"
systemctl start kibana
systemctl enable kibana
これでkibanaのURLにアクセスすれば動作確認ができるはず。ただ、このままだと何のデータもないので、wordpressが動いているサーバからアクセスログを送り付ける。ログを送る方法はちょっと迷うんだけど、とりあえずはtd-agentで。source側はただ送るだけなので、td-agentをインストールして、以下のような設定ファイルを用意するだけで起動できる。うちのwordpressはnginxで動いているので、その認識で読んで下さい。ちなみにnginxのアクセスログはltsv形式で書き出しています。
yum install -y http://packages.treasuredata.com.s3.amazonaws.com/2/redhat/7/x86_64/td-agent-2.3.5-1.el7.x86_64.rpm
vi /etc/td-agent/td-agent.conf
:
<source>
type tail
path /var/log/nginx/access.log
pos_file /var/log/td-agent/buffer/access.log.pos
format none
tag nginx.access
</source>
<match *.**>
type forward
retry_limit 5
flush_interval 5s
<server>
host es
port 20000
</server>
</match>
systemctl start td-agent
systemctl enable td-agent
続いて、Elasticsearchが動いている受け手側にもtd-agentをインストールする。こちらは幾つかpluginが必要なので、それも忘れずに。また、うちのwordpressはURLが日本語をURLencodeしたものになっているので、出来ればURLdecodeしてからElasticsearchに取り込みたい。その変換もtd-agent側でやっておく。Elasticsearchに入れるところもpluginを使えばよしなにやってくれるので楽。fluent-plugin-uri_decoderのバージョンを固定しているのは、これじゃないと動かせなかったから。使い方わかってる人は最新版でも問題ないです。
yum install -y http://packages.treasuredata.com.s3.amazonaws.com/2/redhat/7/x86_64/td-agent-2.3.5-1.el7.x86_64.rpm
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-parser fluent-plugin-typecast fluent-plugin-elasticsearch fluent-plugin-uri_decoder:0.2.0
vi /etc/td-agent/td-agent.conf
:
<source>
type forward
port 20000
</source>
<match nginx.access>
type uri_decode
key_name message
add_prefix decoded
</match>
<match decoded.nginx.access>
type copy
<store>
type parser
format ltsv
time_key time
time_format %Y-%m-%dT%H:%M:%S%:z
add_prefix parsed
key_name message
</store>
</match>
<match parsed.decoded.nginx.access>
type typecast
item_types status:integer,size:integer,reqtime:float,gzip:float
prefix casted
</match>
<match casted.parsed.decoded.nginx.access>
type_name nginx
type elasticsearch
include_tag_key true
tag_key @log_name
host es
port 9200
logstash_format true
flush_interval 10s
buffer_type file
buffer_path /var/log/td-agent/buffer/casted.nginx.access.buffer
</match>
systemctl start td-agent
systemctl enable td-agent
これで無事Elasticsearchにデータが貯まり始めた。あとはDiscoverやVisualizeを駆使して、ダッシュボードを作成するだけ。これだけ簡単にログの集約ができると、もっといろんなデータを放り込んでみたくなる。zabbixと連携させて監視通知みたいにも出来るのかな。今のところ、どうしても把握したい障害は、各々のアプリケーションからダイレクトにメール飛ばしているんだよね。検知をkibanaに集約して通知をzabbixにまとめたりできたらいいなあ。