Скрипт анализа логов сервера apache

Анализ логов Apache вручную при трафике от 10 000 хитов в сутки превращается в бессмысленную трату времени, а пропуск одного паттерна атаки может стоить владельцу сайта потери базы данных за 15 минут. Самописный PHP-скрипт для парсинга access.log позволяет сократить время диагностики ошибок 4xx/5xx с часов до нескольких секунд.

Проблема производительности при парсинге гигабайтных логов

Главная ошибка новичков — использование функции file_get_contents() или file(), которые загружают весь лог в оперативную память. При размере файла лога свыше 200 МБ скрипт мгновенно упрется в лимит memory_limit (обычно 128МБ или 256МБ) и упадет с Fatal Error. Для обработки файлов объемом 1-5 ГБ необходимо использовать исключительно fopen() и построчный перебор через fgets().

Кейс: при оптимизации парсера для сайта с ежедневным логом в 800 МБ, переход с чтения массива на потоковое чтение снизил потребление RAM с 1.2 ГБ до стабильных 12 МБ, независимо от размера файла. Экспертный вывод: любой скрипт анализа логов, не использующий итераторы или потоки, непригоден для реального продакшена.

Регулярные выражения и точность фильтрации трафика

Стандартный Combined Log Format требует строгого соответствия регулярному выражению. Ошибка в одном символе в паттерне приведет к тому, что 100% строк будут проигнорированы. Правильный regex должен четко разделять IP-адрес, дату, метод запроса, статус-код и User-Agent. Важно отсекать внутренние запросы сервера (127.0.0.1), которые могут составлять до 30% общего объема логов, искажая статистику.

Пример: фильтрация запросов к статике (.jpg, .css, .js) позволяет сфокусироваться на динамических PHP-запросах, где и кроется 95% ошибок сервера. Экспертный вывод: используйте именованные группы в preg_match для повышения читаемости кода, иначе поддержка скрипта через месяц станет невозможной.

Детекция атак и поиск аномалий через PHP

Скрипт должен искать не просто ошибки, а паттерны. Например, всплеск 404-х ошибок с одного IP (более 50 запросов в минуту) на несуществующие .php файлы — это явный признак сканирования уязвимостей ботами. В 70% случаев такие запросы идут к /wp-admin, /phpmyadmin или /config.php. Реализация простого счетчика в ассоциативном массиве позволяет выявить злоумышленника за один проход по файлу.

Мини-кейс: внедрение простого анализатора помогло обнаружить L7-DoS атаку, которая имитировала поведение пользователя, но запрашивала тяжелые страницы поиска каждые 2 секунды. Экспертный вывод: автоматизация поиска подозрительных IP — единственный способ оперативно наполнять blacklist в iptables или .htaccess.

Интеграция анализатора в инфраструктуру сервера

Запуск скрипта вручную через браузер — риск безопасности. Правильный подход: вынос скрипта в изолированную директорию вне public_html или запуск через CLI по cron. Если вы планируете использовать интеграция готовых PHP-скриптов в существующую архитектуру, убедитесь, что у пользователя, под которым работает веб-сервер (www-data), есть права на чтение /var/log/apache2, что по умолчанию запрещено из соображений безопасности.

Сравнение: запуск через браузер (риск XSS/RCE) против запуска через CLI (безопасно, доступ к системным ресурсам). CLI-версия работает в 2-3 раза быстрее за счет отсутствия HTTP-оверхеда. Экспертный вывод: никогда не оставляйте скрипты анализа логов доступными по прямой ссылке в сети.

Вывод

Для малых и средних проектов самописный PHP-скрипт на базе fopen() и регулярных выражений — оптимальный выбор, так как он не требует установки тяжелого стека вроде ELK (Elasticsearch, Logstash, Kibana), который потребляет от 4 ГБ RAM. Начинайте с реализации потокового чтения и фильтрации по статус-кодам 4xx и 5xx. Избегайте использования функций чтения всего файла в память и публичного доступа к скрипту через веб-интерфейс. Лучшая стратегия: CLI-скрипт + cron + отправка уведомлений о всплесках ошибок в Telegram API.