2026年9月1日
2026年9月1日
NginxのアクセスログをGoAccessで分析する方法|インストール・ログ形式・HTMLレポート
GoAccess は、Web サーバーのアクセスログを読み込んで、訪問者数・よく見られた URL・ステータスコード・リファラー・ブラウザや OS などを集計するオープンソースのツールです。ターミナル上で対話的に見るほか、1ファイルの HTML レポートや JSON・CSV にも出力できます。Google アナリティクスのようなタグを埋め込む必要がなく、サーバーに届いたリクエストそのものを数えるので、ボットや攻撃的なアクセスの傾向も見えます。
この記事では、Ubuntu 上の Nginx を例に、GoAccess のインストールから、ログ形式の指定、レポートの出力、日々の集計の自動化までを説明します。オプション名は GoAccess の公式マニュアル(goaccess.io/man)で確認し、コマンドは GoAccess 1.12 で動作を確かめています(2026年10月時点)。
インストール
Ubuntu・Debian では、標準のリポジトリからインストールできます。
sudo apt update
sudo apt install goaccess
goaccess --version
標準のリポジトリのものは版が古いことがあります。新しい版を使いたい場合は、GoAccess の公式リポジトリを追加します(公式サイトのダウンロードページの手順です)。
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt update
sudo apt install goaccess
ソースからビルドする場合は、次のようにします。--enable-geoip=mmdb は国・都市の判定に MaxMind 形式(.mmdb)のデータベースを使う指定、--with-zlib は圧縮済みの .gz ログを直接読めるようにする指定です。
sudo apt install build-essential libncursesw5-dev libmaxminddb-dev zlib1g-dev
wget https://tar.goaccess.io/goaccess-1.12.tar.gz
tar -xzvf goaccess-1.12.tar.gz
cd goaccess-1.12/
./configure --enable-utf8 --enable-geoip=mmdb --with-zlib
make
sudo make install
--enable-geoip に指定できるのは mmdb と legacy(古い GeoIP の .dat 形式)だけです。
Nginx のログ形式を指定する
GoAccess は、ログの各行がどの形式で書かれているかを知らないと集計できません。Nginx の既定のログ形式(combined)を使っているなら、--log-format=COMBINED を指定するだけで読めます。日付と時刻の形式も自動で設定されます。
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED
ターミナルに集計画面が開きます。タブキーでパネルを移動し、q で終了します。
request_time を記録している場合
Nginx の log_format を変えて、末尾に処理時間($request_time)を足していることもあります。
log_format timed '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time';
access_log /var/log/nginx/access.log timed;
この場合は、GoAccess に形式を1項目ずつ指定します。$request_time は秒単位(ミリ秒まで)なので %T で受けます。
sudo goaccess /var/log/nginx/access.log \
--log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
--date-format=%d/%b/%Y \
--time-format=%T
主な記号の意味は次のとおりです。
| 記号 | 意味 |
|---|---|
%h |
クライアントの IP アドレス |
%d / %t |
日付 / 時刻(--date-format・--time-format で形式を指定) |
%r |
リクエスト行(メソッド・パス・プロトコル) |
%s |
ステータスコード |
%b |
応答のサイズ |
%R |
リファラー |
%u |
ユーザーエージェント |
%T |
処理時間(秒、ミリ秒まで) |
%^ |
この項目は読み飛ばす |
形式が合っていないと、集計画面の「Failed Requests」が増え、ほとんどのリクエストが数えられません。まず数行で試し、失敗数が 0 になることを確かめてから本番のログに使います。
設定ファイルに書いておく
毎回オプションを付けるのが面倒なら、設定ファイルに書きます。GoAccess は、ユーザーごとの ~/.goaccessrc か、システム全体の goaccess.conf を読みます。goaccess.conf の場所はインストール方法によって異なり、/etc/goaccess/goaccess.conf や、ソースからビルドした場合の /usr/local/etc/goaccess/goaccess.conf などです。書き方はコマンドラインの長いオプションから先頭の -- を除いた形です。
# ~/.goaccessrc
log-format COMBINED
ignore-crawlers true
独自形式の場合は次のように書きます。
# ~/.goaccessrc(request_time 付きの独自形式)
log-format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T
date-format %d/%b/%Y
time-format %T
-p オプション(--config-file)で、別の設定ファイルを指定することもできます。
レポートをファイルに出力する
-o で出力先を指定すると、拡張子に応じて HTML・JSON・CSV のレポートを作ります。
# 1ファイルの HTML レポート
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/stats/report.html
# 他のツールで加工するための JSON
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED -o report.json
HTML レポートはブラウザで開くだけで見られます。--html-report-title でレポートの題名を変えられます。
よく使う絞り込みのオプション
| オプション | 効果 |
|---|---|
--ignore-crawlers |
検索エンジンなどのクローラーを集計から外す |
--exclude-ip=203.0.113.10 |
指定した IP を外す(203.0.113.0-203.0.113.255 のように範囲も可) |
--ignore-status=404 |
指定したステータスコードを外す(複数回指定できる) |
--no-query-string |
URL のクエリ文字列を外して集計する(/?s=test を / にまとめる) |
--anonymize-ip |
IP アドレスの末尾を 0 にして表示する |
--keep-last=7 |
直近7日分だけを残す |
GoAccess のオプションに無い条件で絞りたいときは、grep などで先に行を選び、- で標準入力から渡します。
# 管理画面(/wp-admin/)へのアクセスを除いて集計する
grep -v '"GET /wp-admin/' /var/log/nginx/access.log | goaccess - --log-format=COMBINED -o report.html
ローテーション済みのログもまとめて読む
Ubuntu の Nginx のログは、logrotate によって access.log.1、access.log.2.gz … のように日ごとに分けられ、古いものは圧縮されます。ファイルは複数並べて指定でき、圧縮済みのものは zcat で展開して標準入力から渡します。
# 現在のログと前日分
sudo goaccess /var/log/nginx/access.log /var/log/nginx/access.log.1 --log-format=COMBINED -o report.html
# 圧縮済みのものも含めて全部
sudo sh -c 'zcat /var/log/nginx/access.log.*.gz | goaccess /var/log/nginx/access.log /var/log/nginx/access.log.1 - --log-format=COMBINED -o report.html'
--with-zlib 付きでビルドした GoAccess なら、.gz のファイルをそのまま引数に指定することもできます。
集計結果を蓄積する(--persist と --restore)
ログはローテーションで消えていくので、長期間の集計を続けたい場合は、GoAccess の集計データをディスクに保存します。
sudo mkdir -p /var/lib/goaccess
# 初回: 集計してデータを保存する
sudo goaccess /var/log/nginx/access.log.1 --log-format=COMBINED \
--persist --db-path=/var/lib/goaccess -o /var/www/stats/report.html
# 2回目以降: 保存したデータを読み込み、新しいログを足して保存し直す
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED \
--restore --persist --db-path=/var/lib/goaccess -o /var/www/stats/report.html
--db-path に指定するディレクトリは先に作っておきます(無いとエラーで止まります)。既定の保存先は /tmp なので、再起動で消えないよう別の場所を指定します。手元の確認では、同じログを続けて読み込ませても、すでに処理した行が二重に数えられることはありませんでした。
これを cron で1日1回実行すれば、日々のレポートが自動で更新されます。
# /etc/cron.d/goaccess(毎日 0時10分に実行)
10 0 * * * root goaccess /var/log/nginx/access.log.1 --log-format=COMBINED --restore --persist --db-path=/var/lib/goaccess -o /var/www/stats/report.html
国・地域を表示する(GeoIP)
訪問者の国や地域を集計するには、IP アドレスと地域の対応を収めたデータベース(.mmdb 形式)を用意し、--geoip-database で指定します。無料で使えるものとしては、DB-IP の「IP to City Lite」や、MaxMind の GeoLite2(無料のアカウント登録が必要)があります。どちらも毎月更新されるので、定期的に入れ替えます。
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED \
--geoip-database=/usr/local/share/GeoIP/dbip-city-lite.mmdb \
-o report.html
配布パッケージによっては GeoIP 対応が無効なことがあるため、その場合は公式リポジトリのパッケージか、--enable-geoip=mmdb を付けたソースビルドを使います。
リアルタイムの HTML レポート
--real-time-html を付けると、GoAccess が WebSocket サーバーを起動し、ブラウザで開いた HTML レポートがログの追記に合わせて更新されます。
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED \
-o /var/www/stats/report.html --real-time-html
WebSocket は既定で 7890 番ポートを使うので、ファイアウォールで開けるか、--port で変えます。レポートを HTTPS のページで開く場合は、--ssl-cert と --ssl-key で証明書を指定するか、--ws-url で接続先を指定します。常時起動しておく必要があるため、日々の集計だけで足りるなら、前の節の cron で静的なレポートを作るほうが運用は簡単です。
レポートを公開するときの注意
レポートには、訪問者の IP アドレスやアクセスされた URL がそのまま載ります。Web サーバーの公開ディレクトリに置く場合は、関係者以外が見られないようにします。Nginx なら、Basic 認証や IP アドレスの制限をかけます。
location /stats/ {
auth_basic "stats";
auth_basic_user_file /etc/nginx/.htpasswd_stats;
allow 203.0.113.0/24;
deny all;
satisfy all;
}
/etc/nginx/.htpasswd_stats は、htpasswd(Ubuntu では apache2-utils パッケージ)で作ります。共有するレポートでは、--anonymize-ip で IP アドレスを伏せることもできます。
まとめ
- Nginx の既定のログ形式なら
--log-format=COMBINEDだけで読める。独自形式は%h・%r・%Tなどの記号で1項目ずつ指定する。 - 設定ファイル(
~/.goaccessrcなど)には、長いオプションから--を除いた形で書く。 -oで HTML・JSON・CSV を出力し、--ignore-crawlersや--exclude-ipで集計対象を絞る。- ローテーション済みのログは複数指定と
zcatで読み、長期の集計は--persist・--restoreと cron で蓄積する。 - GeoIP は
--geoip-databaseで .mmdb を指定する。レポートは IP アドレスを含むので、公開範囲を制限する。
WordPress を動かす Nginx の設定全体は、NginxでWordPressを動かす設定で説明しています。