アクセス解析ツール 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)