Анализ логов NGINX: Автоматизация мониторинга и безопасности веб-сайтов. Мониторинг веб-серверов и анализ их работы является критически важной задачей для администраторов. Разработанный скрипт анализа логов NGINX предоставляет комплексное решение для автоматизации этого процесса, позволяя быстро получать детальную информацию о работе сайтов и потенциальных проблемах безопасности.
Итак что я представляю этой статьёй? Написанный скрипт который устанавливается на сервере, задача которого анализ логов находящихся в логах пользователей сервера. Пример: у вас сервер и 15 пользователей, вы хотите сделать быстрый анализ нагрузки сайтов и понять что создаёт нагрузку по ботам и другим деталям. С помощью скрипта вы это можете сделать за несколько минут.
Установка скрипта мониторинга
Итак как установить скрипт и запустить в работу
Создаем файл:
1 |
bash sudo nano /usr/local/bin/analyze_nginx_logs.sh |
Вставляем весь код скрипта
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#!/bin/bash # Базовые настройки BASE_DIR="/var/www" ANALYSIS_DIR="/root/nginx_analysis" DATE_STAMP=$(date +%Y%m%d_%H%M) # Создаем структуру директорий mkdir -p "$ANALYSIS_DIR/$DATE_STAMP/sites" SUMMARY_FILE="$ANALYSIS_DIR/$DATE_STAMP/00_general_summary.txt" # Функция анализа ботов analyze_bots() { local ACCESS_LOG=$1 local OUTPUT_FILE=$2 awk -F'"' ' $6 ~ /bot|crawler|spider|Bot|Crawler|Spider/ { bot = $6 visits[bot]++ } END { printf "n=== Боты отсортированные по количеству страниц ===n" PROCINFO["sorted_in"] = "@val_num_desc" for (bot in visits) { if (visits[bot] >= 2) { printf "%s - %d страницn", bot, visits[bot] } } }' "$ACCESS_LOG" >> "$OUTPUT_FILE" } # Функция анализа страниц analyze_pages() { local ACCESS_LOG=$1 local OUTPUT_FILE=$2 awk '$7 ~ //$/ && $9 == "200" { pages[$7]++ } END { printf "n=== Самые посещаемые страницы (с / на конце) ===n" PROCINFO["sorted_in"] = "@val_num_desc" count = 0 for (page in pages) { if (pages[page] >= 2 && count < 50) { printf "%6d %sn", pages[page], page count++ } } }' "$ACCESS_LOG" >> "$OUTPUT_FILE" } # Функция анализа сайта analyze_site() { local ACCESS_LOG=$1 local ERROR_LOG=${ACCESS_LOG/access.log/error.log} local SITE_NAME=$(basename "$ACCESS_LOG" | sed 's/-frontend.access.log//') local OUTPUT_FILE="$ANALYSIS_DIR/$DATE_STAMP/sites/${SITE_NAME}_analysis.txt" echo "=== Анализ сайта: $SITE_NAME ===" > "$OUTPUT_FILE" # Основная статистика local TOTAL_REQUESTS=$(wc -l < "$ACCESS_LOG") local UNIQUE_IPS=$(awk '{print $1}' "$ACCESS_LOG" | sort -u | wc -l) local ERROR_404=$(awk '$9 == "404"' "$ACCESS_LOG" | wc -l) local ERROR_403=$(awk '$9 == "403"' "$ACCESS_LOG" | wc -l) { echo "Всего запросов: $TOTAL_REQUESTS" echo "Уникальных IP: $UNIQUE_IPS" echo "Ошибок 404: $ERROR_404" echo "Ошибок 403: $ERROR_403" # Анализ ботов analyze_bots "$ACCESS_LOG" "$OUTPUT_FILE" # Анализ страниц analyze_pages "$ACCESS_LOG" "$OUTPUT_FILE" # Анализ ошибок 404 с группировкой echo -e "n=== Страницы с ошибкой 404 (TOP 50) ===" awk '$9 == "404" && $7 ~ //$/ {count[$7]++} END { PROCINFO["sorted_in"] = "@val_num_desc" i = 0 for (url in count) { if (count[url] >= 2 && i < 50) { printf "%6d %sn", count[url], url i++ } } }' "$ACCESS_LOG" >> "$OUTPUT_FILE" # Анализ error.log if [ -f "$ERROR_LOG" ]; then echo -e "n=== Ошибки из error.log ===" echo "Количество записей об ошибках: $(wc -l < "$ERROR_LOG")" echo -e "nIP адреса с ошибками:" grep -oE '[0-9]+.[0-9]+.[0-9]+.[0-9]+' "$ERROR_LOG" | sort | uniq -c | sort -nr echo -e "nТОП 50 ошибок:" sort "$ERROR_LOG" | uniq -c | sort -nr | head -n 50 fi } >> "$OUTPUT_FILE" # Сохраняем данные для общей статистики echo "$SITE_NAME $TOTAL_REQUESTS" >> "/tmp/sites_requests.tmp" [ -f "$ERROR_LOG" ] && echo "$SITE_NAME $(wc -l < "$ERROR_LOG")" >> "/tmp/sites_errors.tmp" awk -F'"' '$6 ~ /bot|crawler|spider|Bot|Crawler|Spider/ {print $6}' "$ACCESS_LOG" >> "/tmp/all_bots.tmp" [ -f "$ERROR_LOG" ] && grep -oE '[0-9]+.[0-9]+.[0-9]+.[0-9]+' "$ERROR_LOG" >> "/tmp/error_ips.tmp" } # Очистка временных файлов rm -f /tmp/sites_*.tmp # Начало анализа echo "=== Общая статистика по всем сайтам $(date) ===" > "$SUMMARY_FILE" # Анализ каждого сайта find $BASE_DIR -type f -name "*-frontend.access.log" | while read -r access_log; do analyze_site "$access_log" done # Формирование общей статистики { echo -e "n=== Общее количество запросов по сайтам ===" sort -k2 -nr /tmp/sites_requests.tmp echo -e "n=== Ошибки по сайтам ===" sort -k2 -nr /tmp/sites_errors.tmp echo -e "n=== Боты по всем сайтам ===" sort /tmp/all_bots.tmp | uniq -c | sort -nr echo -e "n=== IP адреса с ошибками (все сайты) ===" sort /tmp/error_ips.tmp | uniq -c | sort -nr } >> "$SUMMARY_FILE" # Очистка временных файлов rm -f /tmp/sites_*.tmp echo "Анализ завершен. Результаты в $ANALYSIS_DIR/$DATE_STAMP/" |
Сохраняем (Ctrl+X, затем Y, затем Enter)
Делаем файл исполняемым:
1 |
sudo bash chmod +x /usr/local/bin/analyze_nginx_logs.sh |
Запускаем анализ:
1 |
sudo bash /usr/local/bin/analyze_nginx_logs.sh |
Основные задачи скрипта
Скрипт автоматизирует сбор и анализ данных из логов NGINX, обрабатывая как access.log, так и error.log файлы. Он создает структурированные отчеты, содержащие важную информацию о посещаемости, ошибках и попытках несанкционированного доступа. Это позволяет администраторам быстро оценивать состояние всех сайтов на сервере.
Анализ посещаемости
В отчетах отображается детальная статистика посещений для каждого сайта, включая общее количество запросов, уникальных IP-адресов и наиболее популярных страниц. Особенность анализа в том, что он исключает статические файлы (CSS, JavaScript, изображения), концентрируясь на реальных посещениях страниц.
Мониторинг ботов
Важной частью скрипта является анализ активности поисковых роботов и других ботов. Он отслеживает их поведение, подсчитывает количество запросов и, что особенно важно, проверяет эффективность блокировок нежелательных ботов. Это помогает оценить как индексацию сайтов поисковыми системами, так и защиту от вредоносных ботов.
Безопасность и ошибки
Скрипт тщательно анализирует ошибки и подозрительную активность. Он отслеживает 404 и 403 ошибки, попытки доступа к административным разделам, и подозрительные PHP-запросы. Это помогает выявлять попытки взлома и выявлять проблемы в работе сайтов.
Анализ error.log
Отдельное внимание уделяется анализу лога ошибок. Скрипт собирает информацию о системных ошибках, попытках инъекций и других проблемах безопасности, что помогает вовремя реагировать на потенциальные угрозы.
Агрегация данных
Помимо детальных отчетов по каждому сайту, скрипт создает общую сводку по всем сайтам. Это позволяет быстро оценить общую картину и выявить сайты, требующие первоочередного внимания.
Практическое применение
Скрипт особенно полезен для администраторов, управляющих multiple-сайтами. Он позволяет
- Ежедневно отслеживать активность на сайтах
- Контролировать эффективность блокировок
- Выявлять проблемы безопасности
- Оптимизировать работу веб-сервера
Автоматизация и интеграция
Скрипт можно настроить для автоматического запуска через cron, что позволит получать регулярные отчеты о состоянии сайтов. Также его можно интегрировать с системами мониторинга для автоматического оповещения о проблемах.
Простота использования
Несмотря на сложность выполняемых задач, скрипт прост в установке и использовании. Достаточно скопировать его в систему, сделать исполняемым и запустить. Результаты анализа сохраняются в структурированном виде, что облегчает их чтение и обработку.
Заключение
Данный скрипт является мощным инструментом для администраторов веб-серверов, помогая автоматизировать рутинные задачи мониторинга и обеспечения безопасности. Его использование позволяет сэкономить время на анализе логов и быстрее реагировать на возникающие проблемы.