nginxアクセスログ解析をリアルタイムで行いたい GoAccess

hls 配信中にどれくらいのアクセスがあったかを知りたいです。

rtmpで配信している時にはrtmp-moduleで準備されたテンプレートを利用して、帯域や接続数をwebで表示できたのですが、hlsではそのような集計方法がないのが困った点でした。

GoogleAnalyticsでも、リアルタイムにどのwebページにアクセスされているか確認する事が可能です。

GoogleAnalyticsを利用して何とかできないかなど試行錯誤しましたがリアルタイム性はなく、m3u8ファイルにアクセスしている人がどれくらいいるかなどは計りようがありませんでした。

そこで見つけたのがngixのaccess.logをリアルタイムに解析してくれる方法です。

goaccessというコマンドで、シェル上に表示させたり、webリポートの作成ができます。

Screenshot of goaccess.io

GoAccessは、オープンソースのリアルタイム Webログアナライザで、ブラウザを介して実行されるインタラクティブなビューアです。

特徴

  1. C言語で開発され、高速軽快動作します。かつ、随時データが更新されていきます。
  2. GoAccessアプリの依存関係はncursesだけです
  3. 多用なログ形式に対応しています(Apache、Nginx、Amazon S3、Elastic Load Balancing、CloudFrontなど)
  4. 簡単なコマンドで実行可能です
  5. かっこいいダッシュボードデザイン(重要です)

コンパイルに必要なパッケージを準備

apt-get install libgeoip-dev
apt-get install libncursesw5-dev

コンパイルインストール

※apt-get で入るgoaccessは、バージョンが古いので使わない方がいい。詳細は下に記載しています。

$ wget http://tar.goaccess.io/goaccess-1.2.tar.gz
$ tar -xzvf goaccess-1.2.tar.gz
$ cd goaccess-1.2/
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
# make install

Your build configuration:

Prefix : /usr/local
Package : goaccess
Version : 1.2
Dynamic buffer : no
Geolocation : GeoIP Legacy
Storage method : In-memory Hash Database (Default)
TLS/SSL : no
Compiler flags : -pthread
Linker flags : -lnsl -lncursesw -lGeoIP -lpthread
Bugs : goaccess@prosoftcorp.com

デフォルトでできるコンフィグの場所

/usr/local/etc/goaccess.conf

ログフォーマットをここで指定しておくと、–log-format=COMBINEDオプションが必要なくなります。私はnginxのログ解析をしたいので、nginxのログに合わせます。

vi /usr/local/etc/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
goaccess -f /usr/local/nginx/logs/access.log --log-format=COMBINED -

最終100行を随時更新

tail -f -n 100 access.log |goaccess --log-format=COMBINED -
goaccess access.log -o /usr/local/nginx/html/dashbord/report.html --real-time-html --log-format=COMBINED

グラフィカルなアクセス解析ができる

最終1000行を随時webレポートにする

tail -f -n 1000 access.log |goaccess -o /usr/local/nginx/html/dashbord/report.html --
real-time-html --log-format=COMBINED

real-time-htmlをしているのに、静的reportと変わらず、更新時間が、更新されていかない現象に出会いました。なんでだろうなぁと不思議におもっていたのですが、goaccessのwebレポートを自動更新させていくためには外部インターネットから、7890ポートにアクセスできるようにしないといけないそうです。

ファイヤーウォールで7890ポートを閉じているようでしたら、受信の規則を7890ポートが受信できるよう設定してください。

YAMAHA系のルータでしたら、

#ファイヤーウォールに穴をあける
ip filter 103 pass * 192.168.0.5 tcp * 22,www,1935,8080,7890
#内側へのポートフォワーディング
nat descriptor masquerade static 1000 6 192.168.0.5 tcp 22,www,1935,7890

こんな感じで許可を書きます。

aptパッケージの中にもあるが、バージョンが古く思った通り動かない。 –real-time-html や、tail -f |goaccess – とするとエラーが出て使い物にならない。
apt-get install goaccess

参考

GoAccess
https://pantheon.io/docs/nginx-access-log/

tail コマンド
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230894/