Анализ логов Nginx: топ IP и URL по 404/500 ошибкам
Быстрый анализ логов nginx для поиска проблемных IP и URL по ошибкам 404/500 через awk, sort, uniq.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Анализ логов 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".