Nginxのアクセスログ解析ソフトウェアを導入する
1,はじめに
本稿は、Nginxのアクセスログ解析を行うソフトウェア「GoAccess」をDebian 9.8の環境に構築する。
この、GoAccessはオープンソースで開発が行われているソフトウェアで、Nginxのログをグラフィカルに表示する機能を持つ。
本稿はソースコードからコンパイルしているが、よくよく調べてたところ、パッケージが用意されていた。
下記コマンドで一発っぽいorz
apt-get install goaccess
以下、GoAccess V1.3の導入手順を記載する。
2,導入手順
(0)前提要件
本文書は下記の事柄を前提としている。
- 導入先環境の管理者権限を持つユーザーでログインをしていること(全ての作業は管理者権限を持つユーザーで実行する)
- 導入先環境でNginxが稼働していること(同一マシン内)
本文書は同一環境内にWebサーバーが稼働していることを前提としているため、Webサーバーとログ監視サーバーを分けて構築するシステムにおいては、適さない。
(1)実行ファイルの作成
GoAccessの実行ファイルは、公式サイトで配布されているソースコードを、導入先環境でコンパイルする方法により行う。
まず、ソースコードの取得とそれのコンパイル方法について記載する。
(A)ソースコードのダウンロード
GoAccessのソースコード等は公式サイトにて、下記の箇所で公開されている。
GoAccess - Downloads
今回は、Version 1.3を導入するため、下記の手順を執行する。
(ⅰ)GoAccessをコンパイルするための作業用ディレクトリの作成
mkdir tmpGoAccess
作業用ディレクトリの作製箇所及びディレクトリ名は常識の範囲内で任意である。
(ⅱ)作成した作業用ディレクトリへ移動する
cd tmpGoAccess
(ⅲ)ソースコードをダウンロードする
GoAccessのソースコードをダウンロードするために、下記のコマンドを実行する。
wget https://tar.goaccess.io/goaccess-1.3.tar.gz
なお、wgetコマンドが導入されていない場合が想定できる。
その場合は、以下の対処が考えられる。
- 担当者と協議しwgetコマンドを導入する
- curlコマンド等他の手段を用いる
- リモート環境でソースコードをダウンロードする
コマンドの正常実行時の出力は下記の通りである。
root@testspace:~/workspace/tmpGoAccess# wget https://tar.goaccess.io/goaccess-1.3.tar.gz --2019-06-22 11:09:14-- https://tar.goaccess.io/goaccess-1.3.tar.gz tar.goaccess.io (tar.goaccess.io) をDNSに問いあわせています… 107.170.196.4 tar.goaccess.io (tar.goaccess.io)|107.170.196.4|:443 に接続しています… 接続しました。 HTTP による接続要求を送信しました、応答を待っています… 200 OK 長さ: 541374 (529K) [application/x-gzip] `goaccess-1.3.tar.gz' に保存中 goaccess-1.3.tar.gz 100%[===================>] 528.69K 481KB/s in 1.1s 2019-06-22 11:09:16 (481 KB/s) - `goaccess-1.3.tar.gz' へ保存完了 [541374/541374]
(ⅳ)ダウンロードしたソースコードを解凍する
ダウンロードしたソースコードは圧縮ファイルになっているため、下記のコマンドを用いて解凍を行う。
tar -xzvf goaccess-1.3.tar.gz
コマンドの正常実行時の出力は下記の通りである。
root@testspace:~/workspace/tmpGoAccess# tar -xzvf goaccess-1.3.tar.gz goaccess-1.3/ goaccess-1.3/ChangeLog goaccess-1.3/resources/ goaccess-1.3/resources/tpls.html goaccess-1.3/resources/css/ goaccess-1.3/resources/css/app.css goaccess-1.3/resources/css/bootstrap.min.css goaccess-1.3/resources/css/fa.min.css goaccess-1.3/resources/js/ goaccess-1.3/resources/js/charts.js goaccess-1.3/resources/js/d3.v3.min.js goaccess-1.3/resources/js/app.js goaccess-1.3/resources/js/hogan.min.js goaccess-1.3/config/ goaccess-1.3/config/browsers.list goaccess-1.3/config/goaccess.conf goaccess-1.3/depcomp goaccess-1.3/src/ goaccess-1.3/src/browsers.h goaccess-1.3/src/xmalloc.h goaccess-1.3/src/gdns.h goaccess-1.3/src/geoip2.c goaccess-1.3/src/settings.h goaccess-1.3/src/parser.c goaccess-1.3/src/gdashboard.h goaccess-1.3/src/commons.c goaccess-1.3/src/error.h goaccess-1.3/src/sort.c goaccess-1.3/src/error.c goaccess-1.3/src/config.h.in goaccess-1.3/src/gdns.c goaccess-1.3/src/khash.h goaccess-1.3/src/base64.h goaccess-1.3/src/settings.c goaccess-1.3/src/labels.h goaccess-1.3/src/bin2c.c goaccess-1.3/src/goaccess.h goaccess-1.3/src/options.c goaccess-1.3/src/websocket.h goaccess-1.3/src/csv.c goaccess-1.3/src/color.c goaccess-1.3/src/gmenu.c goaccess-1.3/src/opesys.h goaccess-1.3/src/output.h goaccess-1.3/src/gstorage.h goaccess-1.3/src/tcabdb.h goaccess-1.3/src/commons.h goaccess-1.3/src/json.h goaccess-1.3/src/gwsocket.h goaccess-1.3/src/options.h goaccess-1.3/src/geoip1.c goaccess-1.3/src/tcabdb.c goaccess-1.3/src/base64.c goaccess-1.3/src/sort.h goaccess-1.3/src/util.h goaccess-1.3/src/gstorage.c goaccess-1.3/src/sha1.h goaccess-1.3/src/gslist.h goaccess-1.3/src/goaccess.c goaccess-1.3/src/util.c goaccess-1.3/src/gkhash.h goaccess-1.3/src/output.c goaccess-1.3/src/geoip1.h goaccess-1.3/src/gmenu.h goaccess-1.3/src/ui.c goaccess-1.3/src/tcbtdb.c goaccess-1.3/src/gkhash.c goaccess-1.3/src/browsers.c goaccess-1.3/src/gwsocket.c goaccess-1.3/src/sha1.c goaccess-1.3/src/ui.h goaccess-1.3/src/gholder.c goaccess-1.3/src/opesys.c goaccess-1.3/src/json.c goaccess-1.3/src/gholder.h goaccess-1.3/src/parser.h goaccess-1.3/src/tcbtdb.h goaccess-1.3/src/color.h goaccess-1.3/src/gdashboard.c goaccess-1.3/src/xmalloc.c goaccess-1.3/src/websocket.c goaccess-1.3/src/csv.h goaccess-1.3/src/gslist.c goaccess-1.3/README goaccess-1.3/config.sub goaccess-1.3/Makefile.am goaccess-1.3/AUTHORS goaccess-1.3/configure.ac goaccess-1.3/missing goaccess-1.3/COPYING goaccess-1.3/Makefile.in goaccess-1.3/NEWS goaccess-1.3/TODO goaccess-1.3/config.rpath goaccess-1.3/install-sh goaccess-1.3/ABOUT-NLS goaccess-1.3/compile goaccess-1.3/configure goaccess-1.3/goaccess.1 goaccess-1.3/INSTALL goaccess-1.3/po/ goaccess-1.3/po/Makevars goaccess-1.3/po/LINGUAS goaccess-1.3/po/en@quot.header goaccess-1.3/po/zh_CN.gmo goaccess-1.3/po/en@boldquot.header goaccess-1.3/po/ja.gmo goaccess-1.3/po/insert-header.sin goaccess-1.3/po/goaccess.pot goaccess-1.3/po/fr.gmo goaccess-1.3/po/ja.po goaccess-1.3/po/es.po goaccess-1.3/po/es.gmo goaccess-1.3/po/POTFILES.in goaccess-1.3/po/zh_CN.po goaccess-1.3/po/quot.sed goaccess-1.3/po/boldquot.sed goaccess-1.3/po/stamp-po goaccess-1.3/po/Makefile.in.in goaccess-1.3/po/fr.po goaccess-1.3/po/remove-potcdate.sin goaccess-1.3/po/Rules-quot goaccess-1.3/config.guess goaccess-1.3/aclocal.m4 goaccess-1.3/m4/ goaccess-1.3/m4/intlmacosx.m4 goaccess-1.3/m4/progtest.m4 goaccess-1.3/m4/lib-prefix.m4 goaccess-1.3/m4/iconv.m4 goaccess-1.3/m4/gettext.m4 goaccess-1.3/m4/lib-ld.m4 goaccess-1.3/m4/lib-link.m4 goaccess-1.3/m4/nls.m4 goaccess-1.3/m4/po.m4
解凍を実施したディレクトリ内に「goaccess-1.3」という名前を持つディレクトリが作成される。
(B)コンパイルオプションの作成
ダウンロードし解凍を実施したソースコード一式のコンパイルを行う。
(ⅰ)「goaccess-1.3」ディレクトリへ移動する
cd goaccess-1.3/
(ⅱ)コンパイルのオプションの登録を行う
./configure --enable-utf8 --enable-geoip=legacy
(壱)ERROR対応:Missing development files for the GeoIP library
上記コマンドを実行すると、下記のエラーが出力される場合がある。
root@testspace:~/workspace/tmpGoAccess/goaccess-1.3# ./configure --enable-utf8 --enable-geoip=legacy checking for a BSD-compatible install… /usr/bin/install -c checking whether build environment is sane… yes checking for a thread-safe mkdir -p… /bin/mkdir -p checking for gawk… gawk checking whether make sets $(MAKE)… yes checking for gcc… gcc checking whether the C compiler works… yes checking for C compiler default output file name… a.out checking for suffix of executables… checking whether we are cross compiling… no checking for suffix of object files… o checking whether we are using the GNU C compiler… yes checking whether gcc accepts -g… yes checking for gcc option to accept ISO C89… none needed checking for style of include used by make… GNU checking dependency style of gcc… gcc3 checking whether gcc and cc understand -c and -o together… yes checking whether NLS is requested… yes checking for msgfmt… no checking for gmsgfmt… : checking for xgettext… no checking for msgmerge… no checking build system type… x86_64-unknown-linux-gnu checking host system type… x86_64-unknown-linux-gnu checking for ld used by GCC… /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld… yes checking for shared library run path origin… done checking how to run the C preprocessor… gcc -E checking for grep that handles long lines and -e… /bin/grep checking for egrep… /bin/grep -E checking for CFPreferencesCopyAppValue… no checking for CFLocaleCopyCurrent… no checking for GNU gettext in libc… yes checking whether to use NLS… yes checking where the gettext function comes from… libc checking for libintl_dgettext in -lintl… no checking for pthread_create in -lpthread… yes checking whether to build with rdynamic for GNU ld… yes checking for GeoIP_new in -lGeoIP… no configure: error: *** Missing development files for the GeoIP library
これについては開発者のGitHubにおいて対処法が掲載されている(Debian用ではないが)。
Missing development files for the GeoIP library · Issue #243 · allinurl/goaccess · GitHub
https://github.com/allinurl/goaccess/issues/243#issuecomment-279397327
上記記述を参考に、「Missing development files for the GeoIP library」エラー発生時は、下記のコマンドを用いてGeoIP libraryの導入を行う。
apt-get install libgeoip-dev
GeoIPのインストールが正常終了時は下記が出力される。
root@testspace:~/workspace/tmpGoAccess/goaccess-1.3# apt-get install libgeoip-dev パッケージリストを読み込んでいます… 完了 依存関係ツリーを作成しています 状態情報を読み取っています… 完了 以下の追加パッケージがインストールされます: geoip-bin 以下のパッケージが新たにインストールされます: geoip-bin libgeoip-dev アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 166 kB のアーカイブを取得する必要があります。 この操作後に追加で 543 kB のディスク容量が消費されます。 続行しますか? [Y/n] y 取得:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 geoip-bin amd64 1.6.9-4 [66.4 kB] 取得:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libgeoip-dev amd64 1.6.9-4 [99.8 kB] 166 kB を 0秒 で取得しました (185 kB/s) 以前に未選択のパッケージ geoip-bin を選択しています。 (データベースを読み込んでいます … 現在 44865 個のファイルとディレクトリがインストールされています。) …/geoip-bin_1.6.9-4_amd64.deb を展開する準備をしています … geoip-bin (1.6.9-4) を展開しています… 以前に未選択のパッケージ libgeoip-dev を選択しています。 …/libgeoip-dev_1.6.9-4_amd64.deb を展開する準備をしています … libgeoip-dev (1.6.9-4) を展開しています… geoip-bin (1.6.9-4) を設定しています … man-db (2.7.6.1-2) のトリガを処理しています … libgeoip-dev (1.6.9-4) を設定しています …
(弐)ERROR対応:Missing development libraries for ncursesw
また、下記のようなエラーが出力されるかもしれない。
root@testspace:~/workspace/tmpGoAccess/goaccess-1.3# ./configure --enable-utf8 --enable-geoip=legacy checking for a BSD-compatible install… /usr/bin/install -c checking whether build environment is sane… yes checking for a thread-safe mkdir -p… /bin/mkdir -p checking for gawk… gawk checking whether make sets $(MAKE)… yes checking for gcc… gcc checking whether the C compiler works… yes checking for C compiler default output file name… a.out checking for suffix of executables… checking whether we are cross compiling… no checking for suffix of object files… o checking whether we are using the GNU C compiler… yes checking whether gcc accepts -g… yes checking for gcc option to accept ISO C89… none needed checking for style of include used by make… GNU checking dependency style of gcc… gcc3 checking whether gcc and cc understand -c and -o together… yes checking whether NLS is requested… yes checking for msgfmt… no checking for gmsgfmt… : checking for xgettext… no checking for msgmerge… no checking build system type… x86_64-unknown-linux-gnu checking host system type… x86_64-unknown-linux-gnu checking for ld used by GCC… /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld… yes checking for shared library run path origin… done checking how to run the C preprocessor… gcc -E checking for grep that handles long lines and -e… /bin/grep checking for egrep… /bin/grep -E checking for CFPreferencesCopyAppValue… no checking for CFLocaleCopyCurrent… no checking for GNU gettext in libc… yes checking whether to use NLS… yes checking where the gettext function comes from… libc checking for libintl_dgettext in -lintl… no checking for pthread_create in -lpthread… yes checking whether to build with rdynamic for GNU ld… yes checking for GeoIP_new in -lGeoIP… yes checking for mvaddwstr in -lncursesw… no configure: error: *** Missing development libraries for ncursesw
このように「Missing development libraries for ncursesw」のエラーが出力された場合について公式サイトの下記記事が参考となる。
configure: error: *** Missing development libraries for ncursesw · Issue #102 · allinurl/goaccess · GitHub
https://github.com/allinurl/goaccess/issues/102#issuecomment-57303589
上記記述を参考に、下記のコマンドを用いてncurseswの導入を行う。
apt-get install libncursesw5-dev
ncurseswのインストールが正常終了時は下記が出力される。
root@testspace:~/workspace/tmpGoAccess/goaccess-1.3# apt-get install libncursesw5-dev パッケージリストを読み込んでいます… 完了 依存関係ツリーを作成しています 状態情報を読み取っています… 完了 以下の追加パッケージがインストールされます: libtinfo-dev 提案パッケージ: ncurses-doc 以下のパッケージが新たにインストールされます: libncursesw5-dev libtinfo-dev アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 279 kB のアーカイブを取得する必要があります。 この操作後に追加で 1,579 kB のディスク容量が消費されます。 続行しますか? [Y/n] y 取得:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libtinfo-dev amd64 6.0+20161126-1+deb9u2 [79.2 kB] 取得:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libncursesw5-dev amd64 6.0+20161126-1+deb9u2 [200 kB] 279 kB を 0秒 で取得しました (345 kB/s) 以前に未選択のパッケージ libtinfo-dev:amd64 を選択しています。 (データベースを読み込んでいます … 現在 44909 個のファイルとディレクトリがインストールされています。) …/libtinfo-dev_6.0+20161126-1+deb9u2_amd64.deb を展開する準備をしています … libtinfo-dev:amd64 (6.0+20161126-1+deb9u2) を展開しています… 以前に未選択のパッケージ libncursesw5-dev:amd64 を選択しています。 …/libncursesw5-dev_6.0+20161126-1+deb9u2_amd64.deb を展開する準備をしています … libncursesw5-dev:amd64 (6.0+20161126-1+deb9u2) を展開しています… libtinfo-dev:amd64 (6.0+20161126-1+deb9u2) を設定しています … libncursesw5-dev:amd64 (6.0+20161126-1+deb9u2) を設定しています … man-db (2.7.6.1-2) のトリガを処理しています …
(参)正常にコンパイルオプションの登録ができた場合
コンパイルオプションの登録が正常に完了すると、下記が出力される。
root@testspace:~/workspace/tmpGoAccess/goaccess-1.3# ./configure --enable-utf8 --enable-geoip=legacy checking for a BSD-compatible install… /usr/bin/install -c checking whether build environment is sane… yes checking for a thread-safe mkdir -p… /bin/mkdir -p checking for gawk… gawk checking whether make sets $(MAKE)… yes checking for gcc… gcc checking whether the C compiler works… yes checking for C compiler default output file name… a.out checking for suffix of executables… checking whether we are cross compiling… no checking for suffix of object files… o checking whether we are using the GNU C compiler… yes checking whether gcc accepts -g… yes checking for gcc option to accept ISO C89… none needed checking for style of include used by make… GNU checking dependency style of gcc… gcc3 checking whether gcc and cc understand -c and -o together… yes checking whether NLS is requested… yes checking for msgfmt… no checking for gmsgfmt… : checking for xgettext… no checking for msgmerge… no checking build system type… x86_64-unknown-linux-gnu checking host system type… x86_64-unknown-linux-gnu checking for ld used by GCC… /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld… yes checking for shared library run path origin… done checking how to run the C preprocessor… gcc -E checking for grep that handles long lines and -e… /bin/grep checking for egrep… /bin/grep -E checking for CFPreferencesCopyAppValue… no checking for CFLocaleCopyCurrent… no checking for GNU gettext in libc… yes checking whether to use NLS… yes checking where the gettext function comes from… libc checking for libintl_dgettext in -lintl… no checking for pthread_create in -lpthread… yes checking whether to build with rdynamic for GNU ld… yes checking for GeoIP_new in -lGeoIP… yes checking for mvaddwstr in -lncursesw… yes checking for library containing tputs… none required checking for ncursesw/ncurses.h… yes checking for ncurses.h… no checking for sed… yes checking for tr… yes checking for gethostbyname in -lnsl… yes checking for socket in -lsocket… no checking for ANSI C header files… yes checking for sys/types.h… yes checking for sys/stat.h… yes checking for stdlib.h… yes checking for string.h… yes checking for memory.h… yes checking for strings.h… yes checking for inttypes.h… yes checking for stdint.h… yes checking for unistd.h… yes checking arpa/inet.h usability… yes checking arpa/inet.h presence… yes checking for arpa/inet.h… yes checking fcntl.h usability… yes checking fcntl.h presence… yes checking for fcntl.h… yes checking for inttypes.h… (cached) yes checking limits.h usability… yes checking limits.h presence… yes checking for limits.h… yes checking locale.h usability… yes checking locale.h presence… yes checking for locale.h… yes checking netdb.h usability… yes checking netdb.h presence… yes checking for netdb.h… yes checking netinet/in.h usability… yes checking netinet/in.h presence… yes checking for netinet/in.h… yes checking stddef.h usability… yes checking stddef.h presence… yes checking for stddef.h… yes checking for stdint.h… (cached) yes checking for stdlib.h… (cached) yes checking for string.h… (cached) yes checking for strings.h… (cached) yes checking sys/socket.h usability… yes checking sys/socket.h presence… yes checking for sys/socket.h… yes checking sys/time.h usability… yes checking sys/time.h presence… yes checking for sys/time.h… yes checking for unistd.h… (cached) yes checking for an ANSI C-conforming const… yes checking for ptrdiff_t… yes checking whether struct tm is in sys/time.h or time.h… time.h checking for int64_t… yes checking for int8_t… yes checking for off_t… yes checking for size_t… yes checking for uint32_t… yes checking for uint64_t… yes checking for uint8_t… yes checking for _LARGEFILE_SOURCE value needed for large files… no checking for working memcmp… yes checking whether time.h and sys/time.h may both be included… yes checking for sys/time.h… (cached) yes checking for unistd.h… (cached) yes checking for alarm… yes checking for working mktime… yes checking whether lstat correctly handles trailing slash… yes checking whether stat accepts an empty string… no checking for strftime… yes checking for working strtod… yes checking for floor… no checking for gethostbyaddr… yes checking for gethostbyname… yes checking for gettimeofday… yes checking for malloc… yes checking for memmove… yes checking for memset… yes checking for mkfifo… yes checking for realloc… yes checking for realpath… yes checking for regcomp… yes checking for select… yes checking for setlocale… yes checking for socket… yes checking for strcasecmp… yes checking for strchr… yes checking for strcspn… yes checking for strdup… yes checking for strerror… yes checking for strncasecmp… yes checking for strpbrk… yes checking for strrchr… yes checking for strspn… yes checking for strstr… yes checking for strtol… yes checking for strtoull… yes configure: creating ./config.status config.status: creating Makefile config.status: creating po/Makefile.in config.status: creating src/config.h config.status: executing depfiles commands config.status: executing po-directories commands config.status: creating po/POTFILES config.status: creating po/Makefile Your build configuration: Prefix : /usr/local Package : goaccess Version : 1.3 Compiler flags : -pthread Linker flags : -lnsl -lncursesw -lGeoIP -lpthread Dynamic buffer : no Geolocation : GeoIP Legacy Storage method : In-memory Hash Database (Default) TLS/SSL : no Bugs : goaccess@prosoftcorp.com
(C)コンパイル
(ⅰ)実行ファイルの作成
下記コマンドを実行する。
make
正常時の出力例を掲載したかったが、大量のコンパイルログでしかないため、記載しない。
コンパイルエラーが表示されていなければ問題はない。
(ⅱ)実行ファイルを適切な箇所へ配置する
下記コマンドを実行する。
make install
エラーメッセージが出力されていなければ正常終了である。
(2)動作確認
(A)バイナリの動作確認
下記コマンドを実行する。
goaccess --version
正常終了時は下記が出力される。
root@testspace:~# goaccess --version GoAccess - 1.3. For more details visit: http://goaccess.io Copyright (C) 2009-2016 by Gerardo Orellana Build configure arguments: --enable-utf8 --enable-geoip=legacy
(B)Nginxのリアルタイムログ監視を行う
Nginxのログファイルを指定してGoAccessを起動する。
goaccess access.log --log-format=COMBINED
なお、「–log-format=COMBINED」を指定することで、自動的にNginxのログをパースが行われる。
(C)HTML出力
下記コマンドを実行するとリアルタイムのWebで確認できるLog Viewerを作成する。
goaccess -f /tmp/nginx/access.log --log-format=COMBINED -o /tmp/www/logviewer.html --real-time-html
ブラウザからアクセスログを閲覧できる。
リアルタイムの情報反映には、WebSocketが使われている。
そのため、Web画面でリアルタイムのログ監視を実施する場合、ポート「7890」を開放する必要がある。
3,参考文献
- GoAccess – Manual Page
- GoAccess – Frequently Asked Questions
- nginxアクセスログ解析をリアルタイムで行いたい GoAccess オレンジの国
最近のコメント