Используем следующий формат логов, который используется в nginx по умолчанию:

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

Где поля расшифровываются как:

  • $remote_addr – IP с которого был сделан запрос
  • $remote_user – Пользователь, аутентифицированный через HTTP аутентификацию, обычно пустое
  • [$time_local] – Время посещения в часовом поясе сервера
  • “$request” - Тип HTTP-запроса + запрошенный путь без аргументов + версия HTTP
  • $status - код ответа от сервера
  • $body_bytes_sent - размер ответа сервера в байтах
  • “$http_referer” - реферал (если есть)
  • “$http_user_agent” - юзер-агент

Приведем некоторые команды, которые могут помочь проанализировать логи.

Сортировка лога по коду ответа:

cat access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort -rn

Или с помощью awk:

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

Пример вывода:

210433 200
 38587 302
 17571 304
  4544 502
  2616 499
  1144 500
   706 404

Как видите более чем на 700 запросов сервер ответил 404 ошибкой!

Как найти какие запросы получили ошибку? Следующая команда выберет запросы, которые получили в ответ 404 ошибку и отсортирует по числу запросов на URL.

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

Пример вывода:

21 /members/katrinakp/activity/2338/
19 /blogger-to-wordpress/robots.txt
14 /rtpanel/robots.txt

Также, для 502 ошибки:

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

Найдем, с каких IP идут запросы по этим URL:

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

Пример вывода:

14 50.133.11.248
12 97.106.26.244
11 108.247.254.37
10 173.22.165.123

404 для php-скриптов в большинстве случаев является признаком атак:

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

Самые популярные URL:

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

Самые популярные URL, содержащие "ref"

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

Статья переведена с английского. Оригинал статьи