アクセス解析ツール matomo の導入

注)サーバ負荷・管理工数が増加したため、Umamiなどの代替ツールへ移行予定。Matomoを導入する前に必ず他代替ツールと比較検討して下さい。

導入背景

長年利用されてきたオープンソースのウェブアクセス解析ツールAWStatsは、
2025年11月リリースのバージョン8.0を最後に開発およびアップデートが終了しました。
公式サイトでも後継ツールとしてmatomoへの移行が推奨されていることから、matomoを導入することにしました。

AWStatsとmatomoはどちらもオープンソースのアクセス解析ツールですが、
設計思想と動作方式には大きな違いがあります。

AWStatsはログ解析型ツールであり、Webサーバが出力するアクセスログを直接解析します。
JavaScriptを必要とせず、過去のログを遡って解析できる点が特徴で、
CGI(Perl)として比較的シンプルな構成で動作します。

一方、matomoはPHPとSQLデータベースを用いたWebアプリケーション型の解析ツールです。
主にHTMLに埋め込んだJavaScriptトラッキングコードによってアクセス情報を収集し、
リアルタイム性の高い解析や、画面サイズ・滞在時間といったクライアント側の詳細な情報を取得できます。
そのため、LAMP/LEMP構成を前提としたサーバ常駐型アプリケーションとなっています。

また、matomoはオンプレミス環境での運用が可能であり、
GDPRをはじめとしたプライバシー保護機能が標準で実装されている点も特徴です。
Google Analytics の代替として採用されるケースも多いようです。


Dockerコンテナで運用します。


matomoのURLへアクセスし、以下のガイダンスに従い設定してください。

注) トラッキングコードの設定はサイトの属性などにより異なるため、ここでは飛ばして構いません。インストール手続きが終了後設定。


Discourseに導入

テーマのコンポーネントとしてインストール

APIでログファイルを読み込むには

matomoが提示するスクリプトをサイトコンテンツのコードに直接組込むのではなく、NginxなどのサーバのアクセスログをmatomoのAPIを通じて読み込むことで、内部処理した結果を表示するようにもできます。コンテンツのコードを改変する必要がないため、リアルタイムでのアクセス状況を監視する用途でなければ、こちらの方法を推奨します。


Nginxコンテナのアクセスログをホストと共有

Nginxコンテナ内のログをホストと共有するため、以下をNginxのvolumesセクションに追加します。

volumes:
      - /path_to_shared_directory:/var/log/nginx

共有ログの更新

ログの更新をホストのlogrotateで行うため、そのための設定ファイルを作成します。

ex) /etc/logrotate.d/nginx

/path_to_shared_directory/nginx/*.log {
  hourly
  missingok
  rotate 24
  compress
  delaycompress
  notifempty
  sharedscripts
  postrotate
    docker compose kill -s USR1 nginx_container_name
  endscript
}

ログのアップロード

共有ログをmatomoに実装されたpythonスクリプトでAPI経由でmatomoにアップロードします。アップロードには以下の認証トークンが必要です。

管理 → 個人用 → セキュリティ で認証トークンを作成してください。

pythonスクリプトはmatomoコンテナからホストにコピーしてください。

$ docker cp matomo:/var/www/html/misc/log-analytics/import_logs.py ./

ログのアップロードコマンドは以下の通りです。注)参照

$ python3 "$IMPORT_SCRIPT" \
    --url="$MATOMO_URL" \
    --idsite="$SITE_ID" \
    --token-auth="$TOKEN" \
    --recorders=2 \
    "$LOG_PATH"

ログ更新とアップロードの自動化

ホストのcronジョブで、ログの更新とアップロードをスケジュール管理します。注)参照

$ sudo crontab -e

# 毎時0分:強制回転(access.log.1 が作られる)
0 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx

# 毎時5分:メインサイトのログをインポート
5 * * * * python3 "$IMPORT_SCRIPT" --url="$MATOMO_URL" --idsite="$SITE_ID" --token-auth="$TOKEN" --recorders=2 "$LOG_PATH"

注 ) 下記変数は、直接使用するものと置換えて下さい。

  • IMPORT_SCRIPT : import_logs.py
  • MATOMO_URL : https://matomo.example.com/
  • SITE_ID : matomoで指定したサイトのID(管理 → ウェブサイト)
  • TOKEN : 認証トークン
  • LOG_PATH : 共有ログファイルまでのパス(access.log.1)

Nginxのアクセスログからのみ解析するため、以下のプラグインは不要。有効のままだと余計な処理が発生し、サイトのパフォーマンスに影響します。

無効化したプラグイン

  • Ecommerce: Eコマース解析機能。
  • Events: イベントトラッキング機能。
  • RssWidget: RSSフィードを表示するウィジェット。
  • Feedback: Matomo開発チームへのフィードバック送信機能。
  • ScheduledReports: レポートの定期メール送信機能。
  • MobileMessaging: SMS等での通知送信機能。
  • Overlay: ページオーバーレイ(ヒートマップに近い視覚化)機能。
  • Contents: コンテンツ(バナー等)トラッキング機能。
  • Resolution: 画面解像度の解析機能。
  • DevicePlugins: ブラウザプラグイン(Flash等)の解析機能。
  • Heartbeat: 正確な滞在時間を計るための通信機能。
  • Marketplace: 管理画面からのプラグイン検索・追加機能。
  • ProfessionalServices: 有料サポートへのリンク表示。
  • CustomJsTracker: JSトラッカーのカスタマイズ機能。
  • Tour: チュートリアル機能。
  • PagePerformance: ページの読み込み速度解析機能。
  • CustomDimensions: カスタム次元(独自の分析軸)の設定機能。
  • AIAgents: AIエージェント(クローラー等)の識別機能。
  • JsTrackerInstallCheck: JSトラッカーが正しく設置されているかの確認機能。

トラブルシュート

CloudflareのBot対策で、ブラウザ以外のAPIアクセスを禁止したルール設定により、PythonスクリプトによるAPIアクセスがブロックされる不具合発生。

ホスト上でNginxのログファイルとmatomoのログファイルを読み込むpythonスクリプトを管理しているため、ホストの/etc/hostsに以下を追加して対応。Cloudflare経由でのAPIアクセスを回避。

/etc/hosts

127.0.0.1 xxx.ficusonline.com

頻繁なアップデートの度に新規機能が追加される上データベースへの負荷も高くなり、Matomoのための管理工数・サーバ負荷が増加。個人運営サイトでこれを導入するメリットはないと判断しました。

umamiへ移行予定。