Apacheアクセスログで特定URLのアクセス数を集計する方法

Apacheのアクセスログを解析することで、特定のURLへのアクセス状況を把握し、Webサイトの改善やセキュリティ対策に役立てることができます。
例えば、特定のページがどの程度訪問されているかを調べることで、人気コンテンツの把握や不正アクセスの兆候を見つけることが可能です。
本記事では、Apacheのアクセスログから特定のURLに対するアクセス数を効率的に集計する方法を解説します。

基本的なログの仕組みから、grepやawkを使用したシンプルな解析方法、さらには自動化スクリプトや外部ツールを用いた高度な解析方法まで網羅します。
これにより、初心者から上級者までがApacheのログ解析スキルを身につけることができるでしょう。

目次

Apacheアクセスログの基礎知識


Apacheのアクセスログは、Webサーバーへのリクエスト情報を記録したファイルです。これにより、誰が、いつ、どのページにアクセスしたかを把握できます。アクセスログはWebサイトの利用状況や不正アクセスの兆候を分析する際に重要な役割を果たします。

アクセスログの形式


Apacheのデフォルトのアクセスログは「Common Log Format (CLF)」または「Combined Log Format」で記録されます。代表的なログの1行は次のようになります。

192.168.0.1 - - [31/Dec/2024:23:59:59 +0900] "GET /index.html HTTP/1.1" 200 1024

この1行には、次の情報が含まれます。

  • IPアドレス:訪問者のIPアドレス(例:192.168.0.1)
  • 日時:アクセス日時(例:[31/Dec/2024:23:59:59 +0900])
  • リクエスト方法:GETやPOSTなどのHTTPメソッド
  • アクセスURL:リクエストされたURL(例:/index.html)
  • ステータスコード:リクエスト結果(例:200は成功)
  • レスポンスサイズ:返されたデータ量(バイト単位)

Combined Log Formatの追加情報


Combined Log Formatでは、リファラ(参照元)やユーザーエージェント(ブラウザ情報)も記録されます。

192.168.0.1 - - [31/Dec/2024:23:59:59 +0900] "GET /index.html HTTP/1.1" 200 1024 "https://example.com" "Mozilla/5.0"
  • リファラ:アクセス元のURL
  • ユーザーエージェント:ブラウザやOSの情報

これらの情報により、訪問者の行動や利用環境を詳細に分析できます。

アクセスログの保存場所と設定方法


Apacheのアクセスログは、デフォルトで特定のディレクトリに保存されますが、環境や設定によって異なる場合があります。ここでは、アクセスログの保存場所を確認し、必要に応じて設定を変更する方法を解説します。

アクセスログの保存場所


一般的なApache環境でのアクセスログの保存場所は以下の通りです。

  • Ubuntu/Debian系
  /var/log/apache2/access.log
  • CentOS/RHEL系
  /var/log/httpd/access_log
  • macOS (Homebrew版Apache)
  /usr/local/var/log/httpd/access_log

保存場所が不明な場合は、Apacheの設定ファイルを確認します。

ログの保存場所を確認する方法


Apacheの設定ファイルを開き、CustomLogディレクティブを探します。

sudo cat /etc/apache2/sites-available/000-default.conf | grep CustomLog

または

sudo cat /etc/httpd/conf/httpd.conf | grep CustomLog

以下のように出力されます。

CustomLog ${APACHE_LOG_DIR}/access.log combined

${APACHE_LOG_DIR}/var/log/apache2などに解釈されます。

ログの保存場所を変更する


アクセスログの保存場所を変更するには、Apacheの設定ファイルを編集します。

sudo nano /etc/apache2/sites-available/000-default.conf

以下の行を変更します。

CustomLog /var/log/apache2/custom_access.log combined


変更後はApacheを再起動して反映させます。

sudo systemctl restart apache2

複数のログを記録する


必要に応じて複数のログを記録できます。

CustomLog /var/log/apache2/access_main.log combined  
CustomLog /var/log/apache2/access_api.log combined env=api  


この方法を使えば、APIアクセスなど特定の条件下でログを分けることが可能です。

URLフィルタリングの基本方法


Apacheのアクセスログから特定のURLを抽出する際には、シンプルなコマンドラインツールを使う方法が有効です。特にgrepコマンドは、特定の文字列を含むログ行を素早く見つけるのに適しています。

特定のURLを抽出する


以下のコマンドを使って、アクセスログから特定のURLへのアクセスだけを抽出できます。

grep "GET /example-page" /var/log/apache2/access.log


例:

192.168.0.1 - - [31/Dec/2024:12:34:56 +0900] "GET /example-page HTTP/1.1" 200 512
192.168.0.2 - - [31/Dec/2024:12:35:10 +0900] "GET /example-page HTTP/1.1" 200 1024


この結果は、/example-pageへのアクセスが記録されたログ行をすべて表示します。

アクセス数をカウントする


URLごとのアクセス数をカウントするには、wc -lを使います。

grep "GET /example-page" /var/log/apache2/access.log | wc -l


例:

15

これにより、特定のURLへのアクセス回数が15回であることがわかります。

正規表現を使ったフィルタリング


正規表現を使えば、より柔軟に抽出できます。例えば、すべての/products/配下のページを抽出するには、次のようにします。

grep "GET /products/.* HTTP" /var/log/apache2/access.log

特定のステータスコードを含むURLを抽出


200 (成功) や 404 (未検出) のステータスコードを抽出する場合は、次のようにします。

grep "GET /example-page" /var/log/apache2/access.log | grep " 404 "

特定の期間に絞って抽出する


ログの日時を使って特定の期間に絞るには、awksedと組み合わせます。

awk '/31\/Dec\/2024/ && /GET \/example-page/' /var/log/apache2/access.log

これにより、特定の日付にアクセスされたURLが抽出されます。
この方法で、特定のURLに対するアクセス状況を効率的に分析できます。

awkを使用したログ解析


awkはテキスト処理に特化した強力なコマンドで、Apacheのアクセスログ解析に最適です。awkを使うことで、特定のURLへのアクセス数を効率的に集計できます。

awkの基本構文


awkはテキストの各行をフィールドに分割して処理します。Apacheのアクセスログでは、スペース区切りでフィールドが分かれています。

192.168.0.1 - - [31/Dec/2024:12:34:56 +0900] "GET /example-page HTTP/1.1" 200 512

この行は以下のようにフィールドに分解されます。

  • $1:IPアドレス
  • $4:アクセス日時
  • $7:アクセスURL
  • $9:ステータスコード

特定URLのアクセス数を集計する


awkを使って、特定のURLへのアクセス回数をカウントします。

awk '$7 == "/example-page" {count++} END {print count}' /var/log/apache2/access.log


このコマンドは、$7 (URL)が/example-pageである行をカウントします。

すべてのURLのアクセス数を集計する


次のコマンドで、アクセスされたすべてのURLのアクセス回数を集計し、出現頻度順に並べます。

awk '{urls[$7]++} END {for (url in urls) print urls[url], url}' /var/log/apache2/access.log | sort -rn


出力例:

120 /index.html  
85 /products/item1  
40 /contact  

これにより、どのURLがどれだけアクセスされたかが一目でわかります。

特定ステータスコードの集計


ステータスコードが404のURLだけをカウントするには、次のようにします。

awk '$9 == 404 {urls[$7]++} END {for (url in urls) print urls[url], url}' /var/log/apache2/access.log


出力例:

30 /missing-page  
12 /old-link  

日別のアクセス数を集計する


ログの日付部分を抽出し、日別にアクセス数をカウントする方法です。

awk '{split($4, date, ":"); days[date[1]]++} END {for (day in days) print days[day], day}' /var/log/apache2/access.log | sort -rn


出力例:

500 [31/Dec/2024  
450 [30/Dec/2024  

awkを使うことで、複雑なログ解析が簡潔に行えるため、アクセス解析の自動化や定期的なレポート生成にも役立ちます。

Apacheアクセスログ解析ツールの活用


Apacheのアクセスログをより視覚的かつ効率的に解析するために、専用のログ解析ツールを使用するのが効果的です。ここでは、代表的なツールである GoAccessAWStats の特徴と導入方法を紹介します。

1. GoAccess


GoAccessは、リアルタイムでアクセスログを解析し、ターミナルやHTMLレポートで視覚的に結果を確認できるツールです。高速かつ軽量で使いやすいため、システム負荷を抑えつつログ解析が可能です。

GoAccessのインストール


Ubuntu/Debian系

sudo apt update
sudo apt install goaccess


CentOS/RHEL系

sudo yum install goaccess

GoAccessの使い方


基本的なコマンドでログを解析します。

goaccess /var/log/apache2/access.log --log-format=COMBINED


HTMLレポートを生成する場合は以下のように実行します。

goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/html/report.html


ブラウザで http://your-server-ip/report.html にアクセスすれば、グラフィカルなレポートが確認できます。

2. AWStats


AWStatsは、Webベースで動作するアクセス解析ツールで、詳細な統計情報をHTML形式で出力します。ページビューや訪問者数、国別アクセス状況などが可視化されます。

AWStatsのインストール


Ubuntu/Debian系

sudo apt update
sudo apt install awstats


CentOS/RHEL系

sudo yum install awstats

AWStatsの設定


AWStats設定ファイルをコピーして新規作成します。

sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.example.com.conf


次に、/etc/awstats/awstats.example.com.conf を開き、ログファイルのパスとドメインを編集します。

LogFile="/var/log/apache2/access.log"
SiteDomain="example.com"

AWStatsの解析とレポート生成


解析を実行し、レポートを生成します。

sudo /usr/lib/cgi-bin/awstats.pl -config=example.com -update


レポートは http://your-server-ip/awstats/awstats.pl で確認できます。

ツールの選び方

  • GoAccess:リアルタイムで手軽に解析したい場合に最適
  • AWStats:長期的なアクセス解析や詳細なレポートが必要な場合に便利

これらのツールを活用することで、Apacheのアクセスログ解析が効率化され、Webサイトの運用改善につながります。

シェルスクリプトで自動化する方法


Apacheのアクセスログ解析を定期的に行うためには、シェルスクリプトを使って自動化する方法が効果的です。ここでは、特定のURLへのアクセス数を定期的に集計し、レポートとして保存するスクリプトの作成方法を解説します。

基本的なシェルスクリプトの例


以下のスクリプトは、特定のURL(例:/example-page)へのアクセス数を日次で集計し、結果をファイルに出力するものです。

#!/bin/bash

# 日付を取得
DATE=$(date +"%Y-%m-%d")

# ログファイルのパス
LOG_FILE="/var/log/apache2/access.log"

# 集計対象のURL
TARGET_URL="/example-page"

# 結果の出力先
OUTPUT_FILE="/var/log/apache2/report_$DATE.txt"

# 集計と出力
echo "---- アクセスログ集計レポート ($DATE) ----" > $OUTPUT_FILE
echo "URL: $TARGET_URL のアクセス数" >> $OUTPUT_FILE
grep "GET $TARGET_URL" $LOG_FILE | wc -l >> $OUTPUT_FILE

echo "レポートが $OUTPUT_FILE に保存されました。"

スクリプトの説明

  • DATE:現在の日付を取得してレポート名に付与
  • LOG_FILE:Apacheのアクセスログファイルを指定
  • TARGET_URL:解析対象のURLを指定
  • OUTPUT_FILE:集計結果を日付ごとに分けて保存

スクリプトを /usr/local/bin/log_report.sh など任意の場所に保存し、実行権限を付与します。

sudo chmod +x /usr/local/bin/log_report.sh

スケジュール自動化(cron)


このスクリプトを定期的に実行するには、cronジョブを設定します。

sudo crontab -e


以下の行を追加すると、毎日午前3時にスクリプトが自動実行されます。

0 3 * * * /usr/local/bin/log_report.sh

複数のURLを解析するスクリプト


複数のURLを一度に集計する場合は、スクリプトを拡張します。

#!/bin/bash

DATE=$(date +"%Y-%m-%d")
LOG_FILE="/var/log/apache2/access.log"
OUTPUT_FILE="/var/log/apache2/report_$DATE.txt"

echo "---- アクセスログ集計レポート ($DATE) ----" > $OUTPUT_FILE

for url in "/example-page" "/contact" "/products"; do
  count=$(grep "GET $url" $LOG_FILE | wc -l)
  echo "$url のアクセス数: $count" >> $OUTPUT_FILE
done

echo "レポートが $OUTPUT_FILE に保存されました。"

このスクリプトは複数のURLをループ処理し、それぞれのアクセス数をレポートに記録します。

レポートの自動メール送信


解析結果をメールで送信するには、mail コマンドを使います。

cat $OUTPUT_FILE | mail -s "Apacheログレポート ($DATE)" admin@example.com

まとめ


シェルスクリプトを活用することで、Apacheのアクセスログ解析を自動化し、定期的にアクセス状況を把握できます。これにより、負荷の高いページや人気コンテンツの分析が容易になります。

まとめ


本記事では、Apacheのアクセスログを解析し、特定のURLへのアクセス数を集計する方法について解説しました。基本的なgrepawkを使った手法から、GoAccessやAWStatsなどのツール活用、自動化のためのシェルスクリプトまで幅広く紹介しました。

アクセスログの解析を定期的に行うことで、Webサイトのパフォーマンス向上やセキュリティ強化に役立ちます。シェルスクリプトやcronジョブを使った自動化により、運用の負担を軽減しつつ、継続的にアクセス状況を把握することが可能です。

これらの技術を活用し、Apacheサーバーの運用を効率化しましょう。

コメント

コメントする

目次