itfans avatar

Linux系統下分析Nginx日誌

🕦 by itfans





Access logs

以nginx預設的日誌格式為例:

Bash:
1
$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

各欄位的含義分別是:

  • $remote_addr 請求者IP
  • $remote_user HTTP授權使用者,如果不使用Http-based認證方式,其值為空
  • [$time_local] 伺服器時間戳
  • "$request" HTTP請求類型(如GET,POST等)+HTTP請求路徑(不含參數)+HTTP協定版本
  • $status 伺服器返回的狀態碼(如200,404,5xx等)
  • $body_bytes_sent 伺服器回應報文大小,單位byte
  • "$http_referer" referer欄位值
  • "$http_user_agent" User Agent欄位

以下列舉常用的日誌分析命令

根據狀態碼進行請求次數排序

Matlab:
1
cat access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort -r

輸出樣例:

ApacheConf:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
210433 200
  38587 302
  17571 304
   4544 502
   2616 499
   1144 500
    706 404
    355 504
    355 301
    252 000
      9 403
      6 206
      2 408
      2 400

或者使用awk:

1
awk '{print $9}' access.log | sort | uniq -c | sort -r

上例顯示有704次404請求,接下來是如何找到這些請求的URL

1
awk '($9 ~ /404/)' access.log | awk '{print $7}' | sort | uniq -c | sort -r

輸出樣列:

QBasic:
1
2
3
21 /members/katrinakp/activity/2338/
19 /blogger-to-wordpress/robots.txt
14 /rtpanel/robots.txt

接下來考慮如果找到這些請求的IP位址,使用命令:

1
awk -F\" '($2 ~ "/wp-admin/install.php"){print $1}' access.log | awk '{print $1}' | sort | uniq -c | sort -r

輸出樣例:

QBasic:
1
2
3
4
14 50.133.11.248
12 97.106.26.244
11 108.247.254.37
10 173.22.165.123

php後綴的404請求(通常是嗅探)

1
awk '($9 ~ /404/)' access.log | awk -F\" '($2 ~ "^GET .*\.php")' | awk '{print $7}' | sort | uniq -c | sort -r | head -n 20

按URL的請求數排序

1
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r

url包含XYZ:

1
awk -F\" '($2 ~ "ref"){print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r





💘 相关文章

写一条评论

Based on Golang + fastHTTP + sdb | go1.16.13 Processed in 1ms