Nginxアクセスログ:各フィールドの意味と分析方法
Nginxアクセスログは、Webサーバーが処理したすべてのリクエストを記録します。404エラーのデバッグ、遅いエンドポイントの追跡、不審なトラフィックの調査など、最初に確認すべき場所です。しかし、多くの開発者は各フィールドを十分に理解しないまま生のログ行を流し読みしています。このガイドでは、Nginxのデフォルトログフォーマットを分解し、カスタマイズ方法を示し、標準的なコマンドラインツールを使った実践的な分析テクニックを解説します。
Nginxアクセスログのデフォルトフォーマット
Nginxは標準でcombinedログフォーマットを使用しており、次のようになります:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
典型的なログ行:
192.0.2.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
フィールドごとの説明
| フィールド | 変数 | 説明 |
|---|---|---|
| リモートアドレス | $remote_addr | リクエストを行ったクライアントのIPアドレス。 |
| リモートユーザー | $remote_user | HTTP認証が使用されている場合のユーザー名。それ以外は-。 |
| ローカル時刻 | $time_local | [day/month/year:hour:minute:second zone]形式のサーバーローカル時刻。 |
| リクエスト | $request | 完全なリクエスト行:メソッド、パス、HTTPプロトコル。 |
| ステータス | $status | HTTPレスポンスステータスコード(例:200、404、500)。 |
| 送信ボディバイト数 | $body_bytes_sent | ヘッダーを除くレスポンスボディのサイズ(バイト単位)。 |
| リファラー | $http_referer | リクエストのリンク元ページ(クライアントから提供された場合)。 |
| ユーザーエージェント | $http_user_agent | クライアントソフトウェアの文字列(ブラウザ、ボット、ツール)。 |
ログフォーマットのカスタマイズ
リクエスト時間、アップストリーム応答時間、gzip圧縮率など、追加の詳細を取得するために独自のフォーマットを定義できます。httpブロックにlog_formatディレクティブを追加し、access_logで参照します。
http {
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log detailed;
}
よく使われる追加変数:
$request_time– 最初のバイト受信から最後のバイト送信までの合計時間。$upstream_response_time– アップストリーム(例:PHP-FPM、Node.js)の応答を待つ時間。$gzip_ratio– gzipが有効な場合の圧縮率。$http_x_forwarded_for– プロキシやロードバランサー背後での元のクライアントIP。
コマンドラインツールでNginxログを分析する
インサイトを抽出するために高価なソフトウェアは必要ありません。grep、awk、sort、uniqなどの標準的なUnixツールは、ほとんどのタスクに十分な威力を発揮します。
1. 最も頻繁なIPアドレスを特定する
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
これはヘビーヒッターや潜在的なDDoS攻撃元の特定に役立ちます。
2. 最もリクエストされたURLを特定する
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
人気のコンテンツを理解したり、異常なパターンを発見するのに便利です。
3. HTTPステータスコードを集計する
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
404や500がどれくらい発生しているかを素早く確認できます。
4. 応答時間が遅いリクエストを特定する
ログフォーマットに$request_timeを追加していれば、遅いリクエストをフィルタリングできます:
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
しきい値(ここでは1秒)は必要に応じて調整してください。
5. 不審なユーザーエージェントを検出する
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
既知の悪質なボットや異常なクライアントを探します。
実践的なユースケース
- トラブルシューティング:500エラーを特定のエンドポイントやアップストリーム応答時間と関連付ける。
- パフォーマンスチューニング:遅いページを特定し、データベースクエリやキャッシュを最適化する。
- セキュリティ監視:ブルートフォース攻撃の試み(同じIPからの多数の401/403)やURL内のSQLインジェクションパターンを発見する。
- キャパシティプランニング:時間経過に伴うリクエスト量を追跡し、スケーリングの必要性を予測する。
ログパーサーによる分析の自動化
コマンドラインのワンライナーはアドホックなクエリには有効ですが、定期的なレポートには専用ツールが適しています。GoAccessやAWStatsなどのオープンソースのログアナライザーを使用したり、カスタムスクリプトを構築したりできます。何もインストールせずにブラウザベースで素早く解析したい場合は、Nginx Log Analyzerにログ行を貼り付けるだけで、ステータスコード、トップIP、リクエストパスの即時サマリーが得られます。
ログ管理のベストプラクティス
- 定期的にログをローテーションする:ディスク容量の問題を防ぐために
logrotateを使用する。 - ログを一元化する:長期保存と検索のためにログ管理システム(例:ELK、Graylog)に転送する。
- リクエストIDを含める:アプリケーションログと関連付けるために
$request_idを追加する。 - プライバシーを尊重する:GDPRなどの規制で求められる場合はIPを匿名化する。
FAQ
Nginxのアクセスログとエラーログの違いは何ですか?
アクセスログは、クライアントIP、リクエストメソッド、ステータスコード、ユーザーエージェントなど、Nginxが処理したすべてのリクエストを記録します。エラーログは、接続失敗、設定エラー、アップストリームのタイムアウトなど、サーバー問題に関する診断メッセージを記録します。どちらも異なるトラブルシューティングシナリオに不可欠です。
Nginxがロードバランサーの背後にある場合、実際のクライアントIPを確認するにはどうすればよいですか?
Nginxがプロキシやロードバランサーの背後にある場合、$remote_addrはバランサーのIPを示します。元のクライアントIPをログに記録するには、real_ipモジュールを設定してバランサーのIPを信頼し、ログフォーマットで$http_x_forwarded_forまたは$realip_remote_addrを使用します。
ソフトウェアをインストールせずにNginxログを分析できますか?
はい。ターミナルでgrep、awk、sortなどの標準的なUnixコマンドを直接使用できます。グラフィカルなブラウザベースのアプローチには、Nginx Log Analyzerのようなオンラインツールが、インストール不要で素早いインサイトを提供します。
ログを詳しく分析する準備はできましたか?Nginx Log Analyzerでアクセスログを数秒で解析・可視化しましょう。セットアップは不要です。