log_format main '$ remote_addr-$ remote_user [$ time_local] "$ host" "$ request"'
'$ステータス$ body_bytes_sent "$ http_referer"'
'"$ http_user_agent" "$ http_x_forwarded_for"-> $ upstream_response_time';
出力では次のようになります:
188.142.8.61--[14 / Sep / 2014:22:51:03 +0400]“ www.mysite.ru ”“ GET / HTTP / 1.1” 200 519“ 6wwro6rq35muk.ru ”“ Mozilla / 4.0(互換性あり; MSIE 8.0 ; Windows NT 5.1; WOW64; Trident / 4.0; SLCC2; .NET CLR 2.0.191602; .NET CLR 3.5.191602; .NET CLR 3.0.191602 ""-"-> 0.003
1. tail -f /var/log/nginx/nginx.access.log | cut -d '' -f 1 | ログトップ
これにより、全体像を把握できます。リクエストの送信元である一意のIPの分布、1つのIPからのリクエストの数など。
最も価値のあることは、これはすべてリアルタイムで機能し、構成に変更を加えることで状況を監視できることです(たとえば、iptablesを介してTOP 20の最もアクティブなIPを禁止するか、GeoIP http://nginx.orgを介してnginxの要求の地理を一時的に制限します) /ru/docs/http/ngx_http_geoip_module.html )。
次のように表示されます(リアルタイムで更新されます)。
27秒で3199要素(118.48要素/秒)
1 337 12.48 / s 95.65.66.183
2 308 11.41 / s 122.29.177.10
3 304 11.26 / s 122.18.251.54
4,284 10.52 / s 92.98.80.164
5 275 10.19 / s 188.239.14.134
6 275 10.19 / s 201.87.32.17
7270 10.00 / s 112.185.132.118
8 230 8.52 / s 200.77.195.44
9182 6.74 / s 177.35.100.49
10172 6.37 / s 177.34.181.245
この場合、列の意味は次のとおりです。
- 1-シリアル番号
- 2-このIPからのリクエストの数
- 3-このIPからの1秒あたりのリクエスト数
- 4-IP自体
上部にすべてのリクエストの合計統計が表示されます
この場合、IP 95.65.66.183では1秒あたり12.48のリクエストがあり、過去27秒間に337のリクエストが行われています。 残りの行は似ています。
部分的に分析しましょう:
tail -f /var/log/nginx/nginx.access.log-ログファイルの末尾を継続的に読み取ります
cut -d '' -f 1 --dフラグで指定された区切り文字を使用して、文字列を「部分文字列」に分割します。 (この例では、スペースが指定されています)。
フラグ-f 1-シリアル番号「1」のフィールドのみを表示します(この場合、このフィールドにはリクエストの送信元のIPが含まれます)
logtop-同一行 (この場合はIP)の数をカウントし、降順で並べ替えて一覧表示し、途中で統計を追加します(Debianでは、標準リポジトリからaptitudeを通じてインストールされます)。
2. grep "&key =" /var/log/nginx/nginx.access.log | cut -d '' -f 1 | 並べ替え| uniq -c | sort -n | tail -n 30-ログ内のIPによるラインの分布を表示します。
私の場合、1つのIPがリクエストで&key = ...パラメーターを使用する頻度に関する統計を収集する必要がありました。
次のようなものが表示されます。
31 66.249.69.246
47 66.249.69.15
51 66.249.69.46
53 66.249.69.30
803 66.249.64.33
822 66.249.64.25
912 66.249.64.29
1856 66.249.64.90
1867 66.249.64.82
1878 66.249.64.86
- 1-文字列の出現回数(この場合はIP)
- 2-IP自体
この場合、IP 66.249.64.86では、合計1878件のリクエストが到着しました(そして、Whoisを見ると、このIPはGoogleに属し、「悪意のある」ものではないことがわかります)
部分的に分析しましょう:
grep "&key =" /var/log/nginx/nginx.access.log-サブストリング "&key ="を含むログ内のすべての行を見つけます(行のどの部分でもかまいません)
cut -d '' -f 1- (前の例を参照)、印刷IP
sort-行を並べ替えます(次のコマンドが正しく機能するために必要です)
uniq -c-一意の行を表示+これらの行の出現回数をカウント(フラグ-c)
sort -n-数値ソートモードを使用したソート(フラグ-n)
tail -n 30-出現回数が最大の30行を出力します(フラグ-n 30、任意の行数を指定できます)
上記のリクエストはすべてDebianまたはUbuntuに対するものですが、他のLinuxディストリビューションでもコマンドは似ていると思います。