【2026年5月26日時点の情報です】
GoAccessは、ApacheなどのWebサーバーのアクセスログを分析して、アクセス数やよく読まれているページ、訪問者の国やブラウザなどを表示してくれるツールです。端末の画面でも、HTMLのレポートでも見られます。
Googleアナリティクスのようにページにタグを入れるのではなく、サーバーのログそのものを集計するので、クローラー(検索エンジンなどのロボット)や、存在しないページへのアクセス(404)も分かります。
Apacheの設定は、Apache 2の記事で紹介しています。
1. GoAccessをインストールする
GoAccessはEPELにあります。EPELはTripwireの記事で使えるようにしています。
[root@almalinux ~]# dnf -y install goaccess ※GoAccessをインストール
(途中省略)
インストール済み:
goaccess-1.10.2-2.el9.x86_64
完了しました!
[root@almalinux ~]# localectl status ※念のため、日本語になっているか確認
System Locale: LANG=ja_JP.utf8 ← ja_JP.utf8 ならOK(レポートが日本語で表示される)
VC Keymap: jp
X11 Layout: jp2. 設定ファイルを編集する
Apacheのログの形式に合わせて、時刻・日付・ログの形式を設定します。
[root@almalinux ~]# vi /etc/goaccess/goaccess.conf
time-format %H:%M:%S ← 先頭の # を外す
date-format %d/%b/%Y ← 先頭の # を外す
log-format COMBINED ← 先頭の # を外す(Apacheの combined 形式)3. 端末で解析結果を見る
[root@almalinux ~]# goaccess /var/log/httpd/access_log
※端末に解析結果が表示される
ダッシュボード - 解析済みリクエスト全体 (26/ 5月/2026 - 26/ 5月/2026)[表示中のパネル: ユーザー数]
合計リクエスト数 1 ユニークユーザー数 0 要求されたファイル数 1
(以下省略)矢印キーで動かし、Enterキーで詳しい内容を開けます。終わるときは q を押します。
4. HTMLのレポートを作る
[root@almalinux ~]# goaccess /var/log/httpd/access_log -o /var/www/html/report.html ※HTMLのレポートを出力
Cleaning up resources...家のLANのPCのブラウザで、http://[サーバーのIPアドレス]/report.html を開くと、レポートが表示されます。下の画面は、まだ外からのアクセスがないときのものです。

5. レポートを外から見られないようにする
/var/www/html はWordPressと同じ公開フォルダなので、何もしないと、レポートもインターネットから見られてしまいます(例:https://ドメイン/report.html)。レポートには訪問者のIPアドレスなども載るので、自分だけが見られるようにします。方法は、サーバーの構成によって2つあります。
5-1. サーバーで動かしているサイトが1つの場合(家のLANからだけ見られるようにする)
家のLANのPCで http://[サーバーのIPアドレス]/ を開いたときにWordPressが表示される構成なら、レポートへのアクセスを家のLANに限るだけで済みます(コマンドはbash、設定はApacheの設定ファイル)。
[root@almalinux ~]# vi /etc/httpd/conf.d/goaccess-report.conf ※レポートへのアクセスを制限する設定を作成
<Files "report.html">
Require ip 127.0.0.1 192.168.10.0/24
</Files>
[root@almalinux ~]# httpd -t ※設定の書き方をチェック
Syntax OK
[root@almalinux ~]# systemctl reload httpd ※設定を反映Apacheの記事で設定した mod_remoteip によって、Cloudflare Tunnelを通ってきたアクセスは訪問者のIPアドレスで判断されるので、外からは「403 Forbidden」になります。
5-2. 1台で複数のサイトを動かしている場合(パスワードで守られた場所に出す)
私のサーバーはこちらです。ブログのほかに、パスワード(Basic認証)で守ったポートフォリオのサイトも同じサーバーで動かしていて、http://[サーバーのIPアドレス]/ を開くと、ポートフォリオのほうが表示されます。この構成では、5-1の方法だと、ブログ側のレポートを家のLANから開く手段がありません。ドメインで開くとCloudflare経由の「外からのアクセス」になるので、自分も見られなくなります。
そこで、レポートの出力先をBasic認証のかかったフォルダ(私の場合はポートフォリオの /var/www/app)に変え、さらにレポートだけは自分のユーザーしか見られないようにしました(コマンドはbash、設定は.htaccess)。
[root@almalinux ~]# vi /var/www/app/.htaccess ※Basic認証の設定がある.htaccessの最後に追加
# GoAccess のレポートは自分のユーザーだけ
<Files "report.html">
Require user [自分のユーザー名]
</Files>あわせて、6-2のスクリプトの出力先(-o)を /var/www/app/report.html に変え、/var/www/html に残った古い report.html は消します。レポートは https://[ポートフォリオのドメイン]/report.html で、自分のユーザー名とパスワードを入れて開きます。
実は、10月にこの記事を書き直したときは5-1だけを紹介していて、自分のサーバーにはその設定を入れていませんでした。見直したときに https://softdev-learn.cc/report.html が外から開ける状態だったことに気づき、私の構成では5-1では自分も見られないことも分かったので、5-2の形にしました。
どちらの方法でも、設定したら外から見られないことを確かめておきましょう。サーバーで次を実行すると確認できます(コマンドはbash)。
[root@almalinux ~]# curl -s -o /dev/null -w "%{http_code}\n" https://ドメイン/report.html
4035-1なら「403」、5-2で古いファイルを消したなら「404」、ポートフォリオ側のURLでは「401」(パスワードが必要)になれば大丈夫です。、家の外から https://ドメイン/report.html を開いて、見られないことを確かめておきましょう。
6. レポートを自動で更新する
6-1. 集計から外すアクセス
ログには、読者のアクセス以外のものもたくさん入っています。そのまま集計すると、読まれている記事が分かりにくくなるので、次のアクセスをgrepで外してからGoAccessに渡します。
| 除外するもの | 中身 | 外す理由 |
|---|---|---|
| /wp-admin/ | WordPressの管理画面 | 記事を編集しているあいだ、自動保存などの通信(Heartbeat API)が数十秒ごとに走り、アクセス数の上位になってしまうため |
| /wp-login.php | ログイン画面 | 海外のボットなどによるログインの試行が多く、読者のアクセスが分かりにくくなるため(攻撃がなくなるわけではなく、レポートに載らなくなるだけ) |
| ^2001:db8:1234:5678: と ^203\.0\.113\.10 | 自分のIPアドレス | 記事の確認やプレビューなど、自分のアクセスを数えないため(どちらも例。自分の回線のIPv6のプレフィックスとIPv4のアドレスに置き換える) |
| [0-9a-f]{32}.txt | 32文字の英数字の .txt | 存在しないランダムな名前のファイルへのアクセス(Cloudflareの確認と思われる)が多く、404の一覧が埋まってしまうため |
| /wp-cron.php | WordPressの定期実行 | 予約投稿などのために、WordPressが自分自身を呼び出しているアクセスのため |
| 予約投稿などのために、WordPressが自分自身を呼び出しているアクセスのため |
自分のIPアドレスは、家のPCから「IPアドレス確認」などのサイトで確かめられます。IPv6の場合は、先頭の部分(プレフィックス)で指定すると、家の中のどの機器からのアクセスもまとめて外せます。家からのアクセスはIPv4で来ることもあるので(私のサーバーでは、サーバー自身からのアクセスはIPv4でした)、IPv6とIPv4の両方を書いておきます。
アクセスログの各行は、先頭がアクセス元のIPアドレスです。条件の頭に「^」(行の先頭という意味)を付けておくと、ページのURLなどに同じ文字が含まれていても、間違って外されません。
6-2. 更新用のスクリプトを作る
[root@almalinux ~]# vi /root/update_report.sh ※更新用のスクリプトを作成
#!/bin/bash
export LANG="ja_JP.UTF-8"
# 過去のログ(圧縮されたものも含む)をまとめて読み込み、
# 集計から外すアクセスをgrepで取り除いてから、GoAccessに渡す
# ※ 2001:db8: は例。自分のIPアドレスの先頭部分に置き換える
/usr/bin/zcat -f /var/log/httpd/access_log* | /usr/bin/grep -v -E '/wp-admin/|/wp-login\.php|2001:db8:|[0-9a-f]{32}\.txt|/wp-cron\.php' | /usr/bin/goaccess - -o /var/www/html/report.html --log-format=COMBINED
[root@almalinux ~]# chmod +x /root/update_report.sh ※実行できるようにするログは次のローテーションの設定で毎日区切られ、過去の分は圧縮されます。zcat -f を使うと、圧縮されたログも、今のログも、まとめて読み込めるので、レポートには残っている30日分が集計されます。
6-3. 1時間ごとに実行する
[root@almalinux ~]# crontab -e
0 * * * * /root/update_report.sh > /dev/null 2>&1 ← 毎時0分に実行6-4. ログのローテーションを設定する
ログを毎日区切って、30日分を圧縮して残すようにします。logrotateの設定ファイルは、値の後ろにコメントを書くとエラーになるので、コメントは必ず別の行に書きます。
[root@almalinux ~]# vi /etc/logrotate.d/httpd
/var/log/httpd/*log {
# 毎日ローテーション
daily
# 30日分保存
rotate 30
# ファイルがなくてもエラーにしない
missingok
# 空なら処理しない
notifempty
# 圧縮して容量を節約
compress
# 圧縮を1日遅らせる(書き込み中のエラーを防ぐ)
delaycompress
sharedscripts
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
[root@almalinux ~]# logrotate -d /etc/logrotate.d/httpd ※設定を確認(実際にはローテーションしない)
reading config file /etc/logrotate.d/httpd
(途中省略)
rotating pattern: /var/log/httpd/*log after 1 days (30 rotations)「error:」で始まる行が出なければOKです。「error: … bad rotation count」などが出たら、値の後ろにコメントが残っていないか確かめます。
[root@almalinux ~]# logrotate -d /etc/logrotate.d/httpd 2>&1 | grep "rotating pattern"
rotating pattern: /var/log/httpd/*log after 1 days (30 rotations)私のサーバーでは、最初は値の後ろにコメントを書いていたため「error: bad rotation count」が出ていて、この設定が使われていませんでした。コメントを別の行に分けてから、正しく読み込まれるようになりました。
まとめ
GoAccessで、Apacheのアクセスログを分析して、HTMLレポートを毎時自動で更新するようにしました。管理画面や自分のアクセスを外すと、読者がどの記事を読んでいるかが分かりやすくなります。
レポートを公開フォルダに置く場合は、外から見られないように制限しておくのを忘れないようにしましょう。
次は、データベースのMariaDBを入れます。手順はMariaDBの記事で紹介しています。



コメント