Как я упростил себе жизнь с анализом http логов веб-серверов

Недавно столкнулся с задачей, которая знакома каждому системному администратору — нужно было проанализировать логи доступа для нескольких десятков сайтов на сервере. Обычно это превращается в рутинную работу: заходишь в каждую папку, находишь логи, запускаешь GoAccess отдельно для каждого домена… В общем, тоска зеленая.

Решил потратить выходные на написание скрипта, который бы делал всю эту работу автоматически. Получилось довольно неплохо — теперь делюсь с сообществом.

https://gitlab.com/avtobys/log_analysis

Что меня раздражало в стандартном подходе

Представьте ситуацию: у вас сервер с 300+ сайтами, каждый в своей папке, логи могут быть как свежие, так и заархивированные. И вам нужно:

  • Найти все домены
  • Для каждого собрать все его лог-файлы
  • Запустить анализ
  • Получить читаемые отчеты

Делать это вручную — верный способ потратить полгода и при этом что-то забыть или перепутать.

Архитектурный подход

Первое, с чем пришлось разобраться — это разнообразие структур каталогов. BitrixVM складывает логи в одном месте, Plesk — в другом, «чистый» Nginx — в третьем. Вместо того чтобы делать универсальный парсер (который неизбежно где-то сломается), решил пойти по пути выбора из готовых шаблонов.

При запуске скрипт показывает интерактивное меню со стрелочками — выбираешь нужную архитектуру и все. Сейчас поддерживается:

  • BitrixVM
  • Plesk
  • cPanel
  • Стандартный Nginx
  • Apache2

Добавить новую структуру — дело пяти минут, нужно только прописать путь в массиве.

Умная обработка файлов логов

Тут была интересная задачка. Логи могут быть в разных состояниях:

  • Текущий файл access.log
  • Ротированные access.log.1, access.log.2 и так далее
  • Сжатые архивы access.log.1.gz, access.log.2.gz

Плюс нужно было сделать выбор глубины анализа. Иногда достаточно посмотреть только свежие данные, а иногда нужна полная картина за месяц-два.

Решение получилось элегантным — скрипт сначала находит все файлы для домена, сортирует по дате модификации, а потом берет нужное количество самых свежих. При этом автоматически обрабатывает сжатые файлы через zcat.

# Пример того, как это работает внутри
find_and_sort_logs() {
    find "$log_dir" -name "${domain}*.access.log*" | 
    sort -t. -k3,3n | tail -n "$depth"
}

Фильтрация — это важно

Одна из полезных фишек — возможность фильтрации по доменам и IP-адресам. Представьте, что вы расследуете инцидент с конкретного IP или хотите посмотреть статистику только для определенных сайтов.

Фильтрация по IP поддерживает как отдельные адреса, так и подсети в нотации CIDR. Например:

./log_analysis.sh -i "192.168.1.0/24,8.8.8.8"

Это особенно полезно, когда нужно исключить из анализа ботов или, наоборот, сосредоточиться на трафике с определенных сетей.

GoAccess — мощь в простоте

Для генерации отчетов использую GoAccess. Эта утилита просто великолепна — быстрая, информативная, генерирует красивые HTML-отчеты с интерактивными графиками.

Единственная проблема с GoAccess — нужно правильно настроить формат логов. В скрипте это решается автоматическим определением формата на основе выбранной архитектуры сервера.

Практические результаты

После того как скрипт отработает, получаете:

  • Отдельный HTML-отчет для каждого домена
  • Сводный отчет по всем сайтам
  • Все файлы аккуратно сложены в папку log_reports

Отчеты содержат все основные метрики:

  • Количество уникальных посетителей
  • Самые популярные страницы
  • Коды ответов сервера
  • Браузеры и операционные системы
  • География посетителей
  • И много чего еще

Установка и использование

Процесс максимально простой:

  1. Ставим GoAccess (если еще не установлен):
sudo apt-get install goaccess  # для Debian/Ubuntu
sudo yum install goaccess      # для CentOS/RHEL
  1. Скачиваем скрипт и делаем исполняемым:
chmod +x log_analysis.sh
  1. Запускаем с правами root:
sudo ./log_analysis.sh

Дальше просто следуем интерактивному меню.

Реальный кейс использования

На прошлой неделе пришлось разбираться с подозрительно высокой нагрузкой на один из серверов. Раньше я бы пол дня копался в логах разных сайтов, пытаясь найти источник проблемы.

С новым скриптом запустил анализ с фильтрацией по времени (взял только свежие логи), получил отчеты и сразу увидел, что один из сайтов получает аномально много запросов с конкретного IP-диапазона. Оказалось, кто-то запустил агрессивный краулер без соблюдения robots.txt.

Проблему решили за 10 минут блокировкой на уровне файрвола, а весь анализ занял меньше пяти минут.

Автоматизация рутинных задач — это не лень, а здравый смысл. Время, потраченное на написание такого скрипта, окупается уже после нескольких использований. А главное — снижается вероятность человеческих ошибок при анализе.

Если занимаетесь администрированием веб-серверов, рекомендую попробовать. Возможно, вам тоже понравится такой подход к анализу логов.

Надоели танцы с бубнами вокруг лог файлов, флуд, парсинг, AI боты, бестолковые боты?

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *