【GoAccess】ログ解析を完全クリーンにする方法

GoAccess

1. 目的

  • Cloudflare Tunnel(cloudflared)経由のアクセスで、訪問者の生のIPアドレス(IPv4/IPv6)を正しくApacheログに記録する。
  • WordPress特有の内部通信(Heartbeat、疑似Cron)や、管理者自身のアクセス、Cloudflareのヘルスチェックなどの「PV計測におけるノイズ」を完全排除したレポートを自動生成する。

2. ログ除外フィルター対象(5大ノイズ)

除外ターゲット正規表現除外理由
WordPress管理画面/wp-admin/記事編集時に数十秒おきに走る自動保存通信(Heartbeat / admin-ajax.php)の蓄積防止。
ログイン画面/wp-login\.php不正ログインを狙うBotの総当たり攻撃(ブルートフォース)ログの排除。
管理者(自分)のIP240d:f:660:自身のサイト確認や記事プレビューによるPV水増しの防止(※IPv6の先頭セグメントを指定)。
Cloudflare生存確認[0-9a-f]{32}\.txtトンネル接続確認のために自動送信されるランダム英数字txtへのアクセス。放置すると404エラーパネルを埋め尽くす。
WordPress疑似Cron/wp-cron\.php予約投稿などのためにWPが内部で自分自身を呼び出すシステム通信のカット。

3. 更新スクリプトの実装

Cron環境の最小限の PATH 対策として、コマンドはすべてフルパスで記述する。

Bash
[root@almalinux ~]# vi /root/update_report.sh
#!/bin/bash
export LANG="ja_JP.UTF-8"

# 5大ノイズをgrepで一括排除し、パイプでgoaccessに流し込んでレポートを上書き生成
/usr/bin/grep -v -E '/wp-admin/|/wp-login\.php|240d:f:660:|[0-9a-f]{32}\.txt|/wp-cron\.php' /var/log/httpd/access_log | /usr/bin/goaccess - -o /var/www/html/report.html --log-format=COMBINED
Bash
# パーミッション付与: 
[root@almalinux ~]# chmod +x /root/update_report.sh

4. ⚠️ 【最重要】「設定したのに自分のIPやノイズが消えない」ときの対処

原因(ゾンビ復活の正体)

  1. ブラウザの開きっぱなし(WebSocket):
     GoAccessの画面を開いたままだと、ブラウザのメモリ上に古い集計データが保持され続け、サーバーを初期化しても古い記憶と合算されてしまう。
  2. 出力ファイルの仕様:
     既存の report.html があると、GoAccessはそこにデータをマージ(追記)してしまう。
  3. システムキャッシュ:
     共通設定によっては、/var/lib/goaccess/ 等にバイナリDBが保持され、そこからデータが復元されてしまう。

🔥 強制リセット・クリーンアップ手順(何かあったらこれを叩く)

古いレポートファイルを物理的に削除し、生ログを初期化した状態でゼロからスクリプトを叩き直す。

Bash
# 1. サーバーの隠し永続化キャッシュ(データベース)を物理削除
[root@almalinux ~]# rm -rf /var/lib/goaccess/* /tmp/goaccess*

# 2. 過去のデータが保持されているレポートHTMLファイルを削除
[root@almalinux ~]# rm -f /var/www/html/report.html

# 3. 蓄積された古い生ログファイルの中身を空(サイズ0)にする
[root@almalinux ~]# truncate -s 0 /var/log/httpd/access_log

# 4. 更新スクリプトを手動実行し、真っ新な状態からクリーンなレポートを再生成
[root@almalinux ~]# /root/update_report.sh

※実行後はブラウザ側で Ctrl + F5(スーパーリロード)をかける。

5. 反映ログの確認

Bash
# RELOAD が出ていればOK
[root@almalinux ~]# tail -f /var/log/cron

コメント