🐧 Linux 総合学習プラットフォーム
中級 ・ ログ / awk / 集計

アクセスログから状況を数える

サイトが急に重くなった。アクセスログから「どのIPが」「どのURLに」集中しているのかを、awkとuniqの定番パイプで即席集計したい。

手順

wc -l /var/log/nginx/access.logまず総件数で規模感をつかむ。普段の同時間帯と比べて桁が違えば、その時点で異常アクセスの疑いが濃い。
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10上位IPアドレスTop10。awkで1列目(IP)を抜き、sortで並べ、uniq -cで数え、-nrで多い順に。この4段パイプが集計の基本形。
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10上位リクエストURL Top10。特定の重いエンドポイントに集中していればアプリ側の対策対象が絞れる。列番号はログフォーマットに合わせて調整する。
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nrステータスコードの分布。499や502が増えていれば処理しきれず切断が起きている。404の山はスキャン行為の痕跡のことも。
grep ' 502 ' /var/log/nginx/access.log | awk '{print $4}' | cut -c 2-15 | uniq -cエラーを時刻(分単位)で数え、発生が続いているのか一過性かを見る。障害報告に書ける「いつからいつまで」がこれで出せる。
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -3 | awk '$1 > 10000 {print $2}'突出したIPを機械的に抽出する。ここで出たIPは、遮断する前にwhoisや逆引きで正体(自社の監視やCDNでないか)を確認する。
注意上位に出たIPを即遮断しないこと。自社の監視システム・ロードバランサ・CDNのIPが上位に来るのは正常で、それを遮断すると自爆する。集計→正体確認→対処の順を守る。

▶ 学習アプリで実務レシピを使う