BASH
#bash#nginx#logs#analysis#security#monitoring#awk

Анализ логов Nginx: топ IP и URL по 404/500 ошибкам

Быстрый анализ логов nginx для поиска проблемных IP и URL по ошибкам 404/500 через awk, sort, uniq.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Анализ логов nginx для поиска проблемных IP-адресов и URL по ошибкам 404/500. Используйте для выявления атак или проблем на сайте.

# 1. Топ-10 IP по количеству 404 ошибок за сегодня
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 404 {print $1}' | \
  sort | uniq -c | sort -rn | head -10

# 2. Топ-10 URL с 404 ошибками
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 404 {print $7}' | \
  sort | uniq -c | sort -rn | head -10

# 3. Топ-10 IP по 500 ошибкам
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 500 {print $1}' | \
  sort | uniq -c | sort -rn | head -10

# 4. Все 404 ошибки за последний час
grep "$(date -d '1 hour ago' +%d/%b/%Y:%H)" /var/log/nginx/access.log | \
  awk '$9 == 404'

# 5. Топ-20 IP по общему количеству запросов (подозрительная активность)
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '{print $1}' | \
  sort | uniq -c | sort -rn | head -20

# 6. IP с большим количеством разных 404 URL (возможный сканер)
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 404 {print $1, $7}' | \
  sort -u | awk '{print $1}' | \
  uniq -c | sort -rn | head -10

# 7. Все ошибки 4xx и 5xx с URL и IP
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 >= 400 && $9 < 600 {print $9, $1, $7}' | \
  sort -rn

# 8. Топ User-Agent для 404 ошибок (поиск ботов/сканеров)
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 404 {print $NF}' | \
  sort | uniq -c | sort -rn | head -10

# 9. Статистика по кодам ответов за сегодня
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '{print $9}' | \
  sort | uniq -c | sort -rn

# 10. IP с запросами к несуществующим файлам (php, asp и т.д.)
grep $(date +%d/%b/%Y) /var/log/nginx/access.log | \
  awk '$9 == 404 && ($7 ~ /\.php|\.asp|\.aspx|\.jsp/) {print $1, $7}' | \
  sort | uniq -c | sort -rn | head -20

Скрипт для мониторинга:

#!/bin/bash
# Анализ логов nginx за сегодня

LOG_FILE="/var/log/nginx/access.log"
TODAY=$(date +%d/%b/%Y)

echo "=== Топ-10 IP по 404 ошибкам ==="
grep "$TODAY" "$LOG_FILE" | awk '$9 == 404 {print $1}' | sort | uniq -c | sort -rn | head -10

echo -e "\n=== Топ-10 проблемных URL (404) ==="
grep "$TODAY" "$LOG_FILE" | awk '$9 == 404 {print $7}' | sort | uniq -c | sort -rn | head -10

echo -e "\n=== Топ-10 IP по 500 ошибкам ==="
grep "$TODAY" "$LOG_FILE" | awk '$9 == 500 {print $1}' | sort | uniq -c | sort -rn | head -10

echo -e "\n=== Статистика кодов ответов ==="
grep "$TODAY" "$LOG_FILE" | awk '{print $9}' | sort | uniq -c | sort -rn

Usage:

Запустите команды в терминале. Убедитесь, что формат даты в логах соответствует date +%d/%b/%Y (например, 20/Jan/2025). Для других форматов измените команду date.

Notes:

⚠️ Формат даты в nginx логах обычно %d/%b/%Y (например, 20/Jan/2025). Проверьте формат в вашем логе командой head -1 /var/log/nginx/access.log. Для анализа нескольких дней используйте grep -E "20/Jan/2025|21/Jan/2025".