CentOS7 + kibana + Elasticsearch 構築

先日準備した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にまとめたりできたらいいなあ。

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)