注)サーバ負荷・管理工数が増加したため、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へ移行予定。