やりたいこと
- Apacheのアクセスログを、可視化・分析するための環境を作りたい
ということをお題に、
- ApacheのアクセスログをFluentdでtailして
- Elasticsearchに放り込み、Kibanaで参照可能な状態にする
というところまでをやってみます。
環境
Ubuntu Linux 18.04 LTSで行っています。
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
なお、サーバーについては
- ApacheおよびFluentd …
172.17.0.2
- ElasticsearchおよびKibana …
172.17.0.3
で稼働させるものとします。
Apacheのインストール
なにはともあれ、まずはApacheのインストール、それから起動。
$ sudo apt install apache2
$ sudo service apache2 start
インストールされたApacheのバージョン。
$ /usr/sbin/apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2018-10-10T18:59:25
表示するコンテンツがないので、とりあえずApacheのドキュメントを放り込んでみます。
$ cd /var/www/html
$ sudo -E wget https://archive.apache.org/dist/httpd/docs/httpd-docs-2.4.33.ja.zip
$ sudo unzip httpd-docs-2.4.33.ja.zip
$ sudo mv httpd-docs-2.4.33.ja/* ./.
選択しているApacheのバージョンは、apt
でインストールしたものよりも、若干新しいですが…。
tail対象にする、アクセスログの確認。
$ sudo tail -f /var/log/apache2/access.log
172.17.0.1 - - [11/Dec/2018:11:52:14 +0000] "GET /getting-started.html HTTP/1.1" 200 4746 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:16 +0000] "GET /filter.html HTTP/1.1" 200 2425 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:51 +0000] "GET /misc/security_tips.html HTTP/1.1" 200 7814 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:52:53 +0000] "GET /server-wide.html HTTP/1.1" 200 3075 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:01 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2839 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:02 +0000] "GET /vhosts/index.html HTTP/1.1" 200 2838 "http://172.17.0.2/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
172.17.0.1 - - [11/Dec/2018:11:53:03 +0000] "GET /vhosts/fd-limits.html HTTP/1.1" 200 3281 "http://172.17.0.2/vhosts/index.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36"
Fluentdのインストール
続いて、Fluentdをインストールします。
こちらを参照して、実行。
Installing Fluentd Using deb Package
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
起動。
$ sudo service td-agent start
設定は後でやりましょう。
ElasticsearchとKibanaのインストール
続いて、ElasticsearchとKibanaをインストールして起動します。
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
$ tar xf elasticsearch-6.5.2.tar.gz
$ cd elasticsearch-6.5.2
$ vim config/elasticsearch.yml # 設定変更
$ bin/elasticsearch
設定はほぼデフォルトですが、外部からのネットワークアクセスの許可と、Single Node設定にします。
config/elasticsearch.yml
network.host: 0.0.0.0
discovery.type: "single-node"
続いて、Kibanaのインストールと起動。
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.2-linux-x86_64.tar.gz
$ tar xf kibana-6.5.2-linux-x86_64.tar.gz
$ cd kibana-6.5.2-linux-x86_64
$ vim config/kibana.yml # 設定変更
$ bin/kibana
Kibanaについても、外部からアクセスできるように設定します。
config/kibana.yml
server.host: "0.0.0.0"
Fluentdの設定をする
では、Fluentdを設定していきましょう。
Apacheのアクセスログを、Elasticsearchに放り込むように構成します。
まず最初に、インストールしたApacheのデフォルトのログのパーミッションでは、Fluentdから読み込めないため権限変更…。
$ sudo chmod o+rx /var/log/apache2
$ sudo chmod o+r /var/log/apache2/*
では、Fluentdの設定を行います。ほぼドキュメント通りですが、tail Input PluginとElasticsearch Output Pluginを設定します。
/etc/td-agent/td-agent.conf
<source>
@type tail
path /var/log/apache2/access.log
pos_file /var/log/td-agent/apache2-access.log.pos
tag apache2.access
format apache2
</source>
<match apache2.access>
@type elasticsearch
host 172.17.0.3
port 9200
logstash_format true
</match>
Apacheのアクセスログの読み込みの設定はこちらで、ファイル/var/log/apache2/access.log
をtailし、読み込んだポジションを/var/log/td-agent/apache2-access.log.pos
に保存、ファイルフォーマットはapache2
で設定します。
<source>
@type tail
path /var/log/apache2/access.log
pos_file /var/log/td-agent/apache2-access.log.pos
tag apache2.access
format apache2
</source>
Apacheのアクセスログに関しては、パースがプラグインとして提供されていて良いですね。
読み込んだ内容は、「apache2.access」タグを付与します。
そして、タグ「apache2.access」にマッチしたら、Elasticsearchに放り込むようにOutput Pluginを設定します。
<match apache2.access>
@type elasticsearch
host 172.17.0.3
port 9200
logstash_format true
</match>
接続先とポートは見たままですが、logstash_format
というのは取り込む時のElasticsearchのインデックス名をlogstash-%Y.%m.%d
にするかどうかですね(true
の場合、logstash-%Y.%m.%d
となります)。
このように、Fluentdはデータの取り込みやパース、変換、出力をプラグインを使用して行います。
どのようなプラグインがあるかは、ドキュメントを参照しましょう。
- Input Plugins
- Output Plugins
- Filter Plugins
- Parser Plugins
- Formatter Plugins
- Buffer Plugins
- Storage Plugins
ここまで設定したら、Fluentdを再起動します。
$ sudo service td-agent restart
Apacheで公開しているコンテンツにアクセスすると、
ポジションファイルが更新されていきます。
/var/log/td-agent/apache2-access.log.pos
/var/log/apache2/access.log 000000000000122b 000000000024981e
すると、Elasticsearchにデータが入るようになるので、KibanaでDiscoveryの設定を行います。データが入るように設定できていれば、アクセスログが出力されて少しすると、logstash-〜
というインデックスが参照可能になっているはずです。
あとは、これを登録して
参照できるようにすればOKです。
ここから先は、Kibanaで好きなようにVisualizeしましょう。