Webサーバーのアクセスログを集計すると、どこから何回アクセスされているかを一覧で把握できます。急激なアクセス増加の原因調査や、不審な接続元の洗い出しといった場面で役立ちます。この記事では、Apache・Nginxのアクセスログを対象に、接続元ごとのアクセス数を集計する手順をまとめます。
ログファイルのパスを確認する
集計を始める前に、対象のログファイルが存在するパスを確認します。主要なディストリビューションでのデフォルトパスは次のとおりです。
- Apache(Debian/Ubuntu系):
/var/log/apache2/access.log - Apache(RHEL/AlmaLinux系):
/var/log/httpd/access_log - Nginx:
/var/log/nginx/access.log
設定ファイルでパスを変更している場合は、httpd.confやnginx.conf内の CustomLog または access_log ディレクティブで確認できます。ログファイルの読み取りには root 権限、または adm グループの権限が必要な場合があります。権限が不足しているときはコマンドの先頭に sudo を付けて実行してください。
接続元ごとにアクセス数を集計する
Apache および Nginx のデフォルトログ形式(Combined Log Format)では、各行の先頭にアクセス元の IP アドレスが記録されています。次のコマンドで接続元ごとのアクセス数を集計できます。
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
Nginx の場合はパスを変更します。
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
実行すると、左側にアクセス数、右側に IP アドレスが表示され、アクセス数の多い順に並びます。
上位の接続元だけを表示する
アクセス量の多いサーバーでは出力が膨大になります。head コマンドを末尾に追加することで、上位 N 件のみに絞って表示できます。
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
head -20 の数値を変更することで表示件数を調整できます。まず上位 10 件程度で全体の傾向をつかみ、必要に応じて件数を増やすと確認しやすくなります。
特定の日付だけを対象に集計する
障害対応や定期レポートなど、ある日付のアクセスだけを集計したいときは、grep で日付文字列を絞り込んでからパイプに渡します。Apache・Nginx の標準ログ形式では、日付は [04/Nov/2026 のような形式で記録されています。
grep "04/Nov/2026" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn
月単位で絞り込む場合は "Nov/2026" のように指定します。日付の書式はログ設定によって異なるため、head -5 /var/log/apache2/access.log などで実際のログ内容を確認してから検索文字列を決めてください。
ローテーション後のログも集計に含める
ログローテーションにより、古いログは access.log.1 や access.log.1.gz といった圧縮ファイルに保存されます。複数日分をまとめて集計するには、圧縮ファイルも対象に含める必要があります。
圧縮済みの .gz ファイルを含めて集計するには zcat を使います。
zcat /var/log/apache2/access.log.*.gz | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
現在のログと過去のログをまとめて集計したい場合は、cat と zcat を組み合わせます。
{ cat /var/log/apache2/access.log; zcat /var/log/apache2/access.log.*.gz; } | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
集計がうまくいかないときの確認ポイント
先頭フィールドが IP アドレスになっていない
プロキシやロードバランサーを経由している環境では、ログの先頭フィールドが - やプロキシの IP アドレスになっていることがあります。head -5 でログの先頭行を確認し、IP アドレスが何番目のフィールドかを特定してから awk '{print $フィールド番号}' のように変更してください。接続元の実際の IP アドレスをログに記録するには、X-Forwarded-For ヘッダーを取り込むサーバー側の設定が必要です。
ログにホスト名が記録されている
Apache の設定で HostnameLookups On が有効になっている場合、IP アドレスの代わりにホスト名が記録されます。この場合でも同じコマンドで接続元ごとに集計できますが、同一ホストが複数の IP アドレスを持つ場合は別々に集計される点に注意してください。
対象ファイルが空または存在しない
ログローテーション直後はカレントのログファイルが空になっていることがあります。ls -lh /var/log/apache2/ でファイル一覧とサイズを確認し、データが入っているファイルを対象に指定してください。ファイルが存在しない場合は、Web サーバーがまだ起動していないか、ログ出力先が別のパスに設定されている可能性があります。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
