Когда сайт падает в самый неподходящий момент, а клиент уже пишет в мессенджер, логи сервера становятся единственным источником правды. Никакие догадки не заменят строчку с конкретным указанием: ошибка в файле index.php на строке 45, память закончилась, база данных не отвечает. Для тех, кто привык работать с визуальными панелями и CMS, первый взгляд на серверный лог может вызвать растерянность — слишком много технических деталей в одном потоке. На самом деле всё структурировано и логично, нужно лишь знать, куда смотреть и как интерпретировать увиденное.
Разберем практический подход к чтению логов, без погружения в теорию ради теории. Речь пойдёт о том, где искать логи на разных конфигурациях — от дешёвого хостинга с cPanel до собственного VPS, как вычленять конкретные типы ошибок и, главное, что делать после того, как вы их нашли. Материал будет полезен владельцам сайтов на Joomla, WordPress и других платформах, а также всем, кто хочет самостоятельно разбираться в веб-администрировании.
Что такое логи сервера и зачем они нужны
Логи сервера — это хронология всех запросов и событий, которые происходят на вашем веб-сервере. Каждый раз, когда браузер пользователя запрашивает страницу, сервер пишет в журнал строку с IP-адресом посетителя, запрошенным URL, кодом ответа (200, 404, 500), временем обработки запроса и рядом других параметров. Одновременно в отдельный файл попадают ошибки: критические сбои в PHP-скриптах, проблемы с доступом к файлам, таймауты соединений с базой данных.
Вся эта информация генерируется на уровне веб-сервера — Apache или Nginx. CMS вроде Joomla или WordPress могут дополнительно вести собственные журналы, но они лишь дополняют серверные, а не заменяют их. Серверный лог видит проблему до того, как она доберётся до CMS: например, если PHP-скрипт упал с фатальной ошибкой, это зафиксируется в логе ошибок Apache, а WordPress даже не успеет обработать запрос и записать что-либо в свой debug.log.
Почему это важно для веб-мастера
- Диагностика ошибок. Когда пользователь видит «500 Internal Server Error», лог ошибок показывает полный стек вызовов: какой именно файл вызвал сбой, какая библиотека не загрузилась, на какой строке прервалось выполнение. Без логов вы бы просто перебирали варианты вслепую — переименовывали плагины, сбрасывали настройки, гадали на кофейной гуще.
- Оптимизация скорости. В логах доступа видно, какие запросы обрабатываются медленнее всего. На практике часто оказывается, что три-четыре страницы с тяжёлыми запросами к базе данных замедляют весь сайт, создавая очередь на сервере. Логи позволяют точно определить эти страницы.
- Безопасность. Массовые POST-запросы к /wp-login.php с разных IP, сканирование /administrator/index.php на Joomla, попытки доступа к .env-файлам — всё это оставляет следы в логах доступа. Вовремя замеченная атака предотвращает взлом, а не устраняет его последствия.
- Анализ поведения пользователей. Серверные логи показывают реальную картину посещаемости, которую не искажают блокировщики скриптов. Можно отследить, с каких страниц уходят посетители, на каких URLs возникают 404 ошибки из-за битых ссылок.
- Контроль работоспособности. Если сайт периодически «падает» по ночам, логи часто указывают на конкретный процесс: cron-задача, которая съедает всю память, или пик обращений поискового бота, создающий чрезмерную нагрузку.
Как логи работают в разных системах
Логи сервера не зависят от используемой CMS. Apache и Nginx записывают их одинаково для сайта на Joomla, WordPress, самописном PHP-фреймворке или Tilda (если она развёрнута на вашем сервере). Разница только в способе доступа:
- Хостинг с панелью управления: cPanel, ISPmanager, Plesk, DirectAdmin — логи доступны через веб-интерфейс, обычно с ограничением на количество отображаемых строк.
- Собственный VPS или выделенный сервер: логи хранятся в текстовых файлах в директориях /var/log/ (Linux) или C:\inetpub\logs\ (Windows), доступны через SSH или FTP.
- Облачные платформы: AWS, Google Cloud, Azure — логи собираются через встроенные сервисы мониторинга и доступны через API или веб-консоли.
На практике большинство веб-мастеров начинают с панели хостинга, а по мере роста проектов переходят к работе с логами через консольные утилиты или централизованные системы сбора логов.
Где искать логи сервера: основные источники
Поиск логов — первый практический шаг. Местоположение зависит от типа хостинга и конфигурации сервера, но общие принципы едины. Рассмотрим основные варианты от простого к сложному.
1. Панель управления хостингом
Самый доступный способ для большинства веб-мастеров. Практически любой коммерческий хостинг в России предоставляет панель управления с разделом для просмотра логов.
cPanel: зайдите в раздел «Metrics» → «Errors» для просмотра логов ошибок и «Raw Access Logs» для логов посещений. В «Raw Access Logs» можно скачать полный файл за определённый период — это полезно, когда встроенный просмотрщик показывает только последние 300 строк, а ошибка происходила вчера. Также логи часто лежат в директории /home/username/logs/, доступной через «File Manager».
ISPmanager: раздел «Логи» даёт доступ к журналам ошибок Apache/Nginx и логам посещений. Удобная особенность — встроенная фильтрация по IP, URL и коду ответа. Если сайт работает на связке Nginx + Apache, логи будут в двух вкладках, и смотреть нужно обе: ошибка может быть зафиксирована как в логе фронтенда (Nginx), так и в логе бэкенда (Apache).
Plesk: во вкладке «Логи» доступны логи ошибок и доступа. Можно настроить автоматическую отправку логов на email — полезная функция для мониторинга, но на практике при большом количестве ошибок ящик быстро переполняется.
FastPanel, DirectAdmin: ищите разделы «Логи» или «Мониторинг». В FastPanel логи Apache/Nginx находятся в соответствующем пункте меню, интерфейс интуитивный.
Важно: на недорогих тарифах хостинга доступ к полному файлу логов может быть ограничен. Встроенный просмотрщик часто показывает только последние 100–500 записей, и если ошибка возникла сутки назад, вы её не увидите. В таких случаях либо включайте запись логов в отдельный файл через настройки CMS (например, debug.log в WordPress), либо переходите на тариф с полноценным доступом к логам.
2. Текстовые файлы на сервере (Linux)
Если у вас свой VPS или выделенный сервер с доступом по SSH, логи хранятся в стандартных директориях. Это наиболее гибкий способ работы — доступны все записи с момента создания файла, можно использовать консольные утилиты для фильтрации и поиска.
| Сервер | Путь к логу ошибок | Путь к логу посещений |
|---|---|---|
| Apache | /var/log/apache2/error.log | /var/log/apache2/access.log |
| Nginx | /var/log/nginx/error.log | /var/log/nginx/access.log |
| IIS (Windows) | C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log | C:\inetpub\logs\LogFiles\W3SVC1\ |
Как открывать и работать с файлами:
tail -n 100 /var/log/apache2/error.log— последние 100 записей. Быстрый способ посмотреть, что происходило в последние минуты.tail -f /var/log/apache2/error.log— режим реального времени. Запустите в одном окне терминала, а в другом воспроизводите ошибку на сайте — увидите запись мгновенно. Незаменимо при отладке.grep "500" /var/log/apache2/access.log— фильтрация по коду статуса. Выводит только строки с 500-ми ошибками.cat /var/log/apache2/error.log | grep "PHP Fatal"— поиск фатальных ошибок PHP.
На практике часто используется комбинация команд: tail -n 1000 /var/log/apache2/access.log | grep " 500 " | awk '{print $1, $7, $9}' — эта команда покажет IP, URL и статус для последних 500-х ошибок.
3. Облачные сервисы и мониторинг
На облачных платформах работа с логами организована через централизованные сервисы:
- AWS CloudWatch Logs — сбор логов со всех инстансов в одном интерфейсе. Можно настраивать метрики и алерты: например, получать уведомление в Telegram при появлении более 10 ошибок 500 за минуту.
- Google Cloud Logging — поиск по ключевым словам, фильтрация по времени, интеграция с другими сервисами Google Cloud.
- Azure Monitor — аналогичный функционал для экосистемы Microsoft.
Эти инструменты особенно ценны, когда у вас несколько серверов и нужно видеть общую картину, не подключаясь к каждому по SSH.
4. Логи CMS (внутренние)
Когда доступ к серверным логам ограничен, выручают встроенные механизмы CMS:
- Joomla: файл
logs/error.log, если логирование включено в настройках. Важно: по умолчанию эта опция часто выключена, проверьте «Общие настройки → Система → Ведение журнала отладки». - WordPress: файл
wp-content/debug.logпоявляется, если в wp-config.php добавлены строки:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);. Без этого лог не пишется. - Tilda: логи недоступны напрямую. Можно использовать встроенный мониторинг в панели Tilda, но он показывает только ошибки на уровне платформы, а не сервера.
Логи CMS удобны для отладки ошибок в шаблонах и плагинах, но не заменяют серверные логи. Например, проблему с правами доступа к файлу вы в дебаг-логе CMS можете вообще не увидеть, а в серверном логе ошибок Apache она будет зафиксирована как «Permission Denied».
5. Инструменты для анализа логов
Для регулярной работы с логами ручной просмотр быстро надоедает. Инструменты автоматизируют анализ и делают его наглядным:
- GoAccess — терминальный или веб-интерфейс для анализа логов Apache/Nginx в реальном времени. Показывает топ запрашиваемых URL, коды ответов, источники трафика. Настраивается за 10 минут даже на недорогом VPS.
- AWStats — генератор статических отчётов. Хорош для периодического анализа посещаемости, но для оперативной диагностики ошибок менее удобен.
- Logwatch — автоматический анализ логов и отправка сводок на email. Полезен для ежедневного мониторинга: утром получаете отчёт с количеством ошибок и подозрительной активностью за ночь.
- Kibana + Elasticsearch — промышленное решение для больших проектов. Позволяет строить сложные запросы, визуализировать данные, настраивать предиктивные алерты. Требует ресурсов и времени на внедрение.
Для большинства небольших проектов на Joomla или WordPress вполне достаточно GoAccess или комбинации tail + grep. Переходить на Kibana стоит, когда логов становится больше пары гигабайт в день и ручной анализ перестаёт быть эффективным.
Как читать логи: структура и основные элементы
Логи сервера — это не хаотичный набор символов, а строго структурированные записи. Умение быстро выхватывать взглядом ключевые поля экономит часы при диагностике.
1. Логи посещений (Access Logs)
Каждая строка лога доступа — это один HTTP-запрос к серверу. Формат может различаться в зависимости от настроек Apache (Combined, Common) или Nginx, но основные поля присутствуют всегда.
Пример строки Apache (Combined формат):
192.168.1.100 - frank [07/Jul/2026:10:15:30 +0300] "GET /index.php?page=about HTTP/1.1" 200 12345 "https://google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
Разбор полей:
- IP-адрес посетителя (
192.168.1.100) — с какого адреса пришёл запрос. При анализе атак это первое, на что смотрите. - Идентификатор пользователя (
- frank) — обычно-для анонимных запросов. Заполняется редко, в основном при использовании HTTP-аутентификации. - Дата и время (
[07/Jul/2026:10:15:30 +0300]) — временная метка запроса с часовым поясом. Позволяет точно определить, когда произошла ошибка. - Запрос (
"GET /index.php?page=about HTTP/1.1") — метод (GET, POST, HEAD), URL, версия протокола. Метод важен: POST-запросы к /wp-login.php с разных IP — признак перебора паролей. - Статус ответа (
200) — ключевое поле для поиска проблем. Запомните: 2xx — успех, 3xx — перенаправление, 4xx — ошибка клиента, 5xx — ошибка сервера. - Размер ответа (
12345) — объём переданных данных в байтах. Аномально большие или маленькие значения могут указывать на проблемы с выводом контента. - Ссылка-источник (
"https://google.com/") — откуда пришёл пользователь. Поле берётся из заголовка Referer, который может отсутствовать или быть подменён. - User-Agent (
"Mozilla/5.0...") — информация о браузере и ОС. По этому полю можно отличить реального пользователя от бота.
Пример строки Nginx:
192.168.1.100 - - [07/Jul/2026:10:15:30 +0300] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 435 "https://site.ru/" "Mozilla/5.0"
В Nginx поля те же, но порядок может слегка отличаться. Конкретный формат задаётся директивой log_format в конфигурационном файле nginx.conf. Если логи выглядят нестандартно, проверьте эту директиву.
2. Логи ошибок (Error Logs)
Логи ошибок фиксируют всё, что идёт не по плану: от фатальных сбоев PHP до предупреждений о нехватке памяти. Строка обычно содержит дату, уровень ошибки, клиента (если есть) и текст ошибки.
Пример строки Apache:
[Sun Jul 07 10:15:31.234567 2026] [error] [client 192.168.1.100] PHP Fatal error: Class 'CustomPlugin' not found in /var/www/site/index.php:45
Разбор полей:
- Дата и время (
[Sun Jul 07 10:15:31.234567 2026]) — когда произошла ошибка, с точностью до микросекунд. - Тип ошибки (
[error]) — уровень: error (ошибка), warn (предупреждение), notice (уведомление), crit (критическая). Для диагностики важнее всего error и crit. - IP-адрес клиента (
[client 192.168.1.100]) — кто спровоцировал ошибку. Может отсутствовать, если ошибка возникла при запуске сервера или выполнении cron-задачи. - Описание ошибки (
PHP Fatal error: Class 'CustomPlugin' not found) — самое ценное поле. Прямо указывает, что произошло: не найден класс, синтаксическая ошибка, закончилась память. - Путь к файлу и строка (
/var/www/site/index.php:45) — точное место в коде, где произошёл сбой.
Пример строки Nginx:
2026/07/07 10:15:31 [error] 1234#1234: *5678 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.100, server: site.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/"
Nginx подробно описывает, что именно пошло не так: отказ в соединении с upstream (бэкендом), таймаут, ошибка разрешения DNS. Строки с «upstream» в Nginx-логах ошибок — верный признак проблем со связкой Nginx + PHP-FPM или Nginx + Apache.
3. Ключевые HTTP-статусы
Коды состояния HTTP — это первый фильтр при анализе логов доступа. По ним вы сразу сужаете круг поиска.
| Код | Название | Что это значит | Типичные действия |
|---|---|---|---|
| 200 | OK | Запрос обработан успешно | Ничего, страница работает |
| 301 | Moved Permanently | Постоянное перенаправление | Проверить, корректно ли настроен редирект, не создаёт ли он цепочек |
| 302 | Found | Временное перенаправление | Проверить, не используется ли оно вместо 301 (SEO-последствия) |
| 400 | Bad Request | Некорректный запрос | Проверить URL на опечатки, проверить заголовки запроса |
| 401 | Unauthorized | Требуется авторизация | Проверить настройки защиты страницы |
| 403 | Forbidden | Доступ запрещён | Проверить права на файл/директорию, .htaccess, конфигурацию Nginx |
| 404 | Not Found | Файл или страница не найдены | Проверить существование файла, правильность URL, настройки ЧПУ |
| 405 | Method Not Allowed | Метод не поддерживается | Проверить, какой HTTP-метод используется (GET/POST) |
| 408 | Request Timeout | Таймаут запроса | Увеличить время ожидания или оптимизировать медленный код |
| 500 | Internal Server Error | Внутренняя ошибка сервера | Смотреть лог ошибок: код PHP, база данных, память, конфигурация |
| 502 | Bad Gateway | Бэкенд не ответил | Проверить, запущен ли PHP-FPM/Apache, работает ли база данных |
| 503 | Service Unavailable | Сервис временно недоступен | Проверить нагрузку, количество подключений, перезапустить бэкенд |
| 504 | Gateway Timeout | Бэкенд не ответил вовремя | Увеличить таймаут или оптимизировать медленный запрос |
Запомните грубое разделение: коды 400–499 — проблемы на стороне клиента (пользователь запросил несуществующую страницу, не авторизован), 500–599 — проблемы на сервере (ошибка в коде, упала база данных). Это первое, что нужно определить при анализе.
4. Типы ошибок в логах
В логах ошибок Apache и Nginx встречаются характерные формулировки, по которым можно быстро определить категорию проблемы:
- PHP Fatal Error — самый частый тип. Критическая ошибка PHP: не найден класс, функция, файл. Скрипт прерывается, пользователи видят 500 ошибку или белый экран.
- Segmentation Fault — ошибка доступа к памяти на уровне процесса. Часто связана с расширениями PHP, написанными на C (например, imagick, ioncube). Решается обновлением или переустановкой расширения.
- Permission Denied — нет доступа к файлу или директории. Типичная ситуация после восстановления из бэкапа или ручного изменения прав.
- Connection Refused — сервер не может подключиться к бэкенду. Либо не запущен сервис (PHP-FPM, MySQL), либо указан неверный порт.
- Timeout — запрос не уложился в отведённое время. Часто при импорте больших файлов, генерации отчётов или медленных запросах к API.
- Disk Full — на диске закончилось место. Сервер не может писать логи, создавать временные файлы, кешировать данные.
- Memory Limit — превышен лимит памяти для PHP-скрипта. Решается увеличением memory_limit в php.ini или оптимизацией кода.
Основные ошибки сайта и как их находить в логах
Разберём конкретные сценарии, с которыми сталкивается каждый веб-мастер. От получения ошибки на сайте до её исправления — с примерами строк из реальных логов.
1. Ошибка 404: Файл не найден
Как это выглядит на сайте: пользователь переходит по ссылке и видит «404 Not Found» или кастомную страницу «Страница не найдена».
В логах доступа: строка с кодом 404 в девятом поле (второе с конца в стандартном Combined-формате).
Пример строки:
83.220.239.19 - - [07/Jul/2026:11:22:33 +0300] "GET /old-page.html HTTP/1.1" 404 245 "https://google.com/search?q=site" "Mozilla/5.0"
Что искать в логах ошибок: может быть запись вида File does not exist: /var/www/site/old-page.html. Это прямое указание на то, что файла физически нет на диске.
Типичные причины:
- Страницу удалили, а ссылки на неё остались в меню, в статьях или поисковых системах.
- В Joomla изменили алиас материала, не настроив редирект со старого URL.
- В WordPress отключили плагин, который отвечал за генерацию определённого типа страниц.
- Ошибка в файле .htaccess — модуль mod_rewrite неправильно преобразует ЧПУ-ссылки.
Алгоритм исправления:
- Проверить, есть ли файл физически на сервере:
ls -la /var/www/site/old-page.html. - Если файл удалён, а страница должна существовать — понять, какой компонент CMS её генерирует. В Joomla это может быть материал, в WordPress — запись или страница.
- Если URL изменился — настроить 301-редирект. В Joomla это делается через компонент «Перенаправления», в WordPress — через плагин типа Redirection или через .htaccess.
- Если URL ошибочный — исправить ссылку в коде, контенте или меню.
2. Ошибка 500: Internal Server Error
Как это выглядит на сайте: белый экран или стандартная страница «500 Internal Server Error». Самая неприятная ситуация для веб-мастера, потому что она редко бывает очевидной.
В логах доступа: строка с кодом 500.
Пример в логах ошибок:
[Mon Jul 08 14:22:45.123456 2026] [error] [client 95.24.178.43] PHP Fatal error: require_once(): Failed opening required '/var/www/site/plugins/system/customplugin/customplugin.php' (include_path='.:/usr/share/php') in /var/www/site/plugins/system/customplugin/customplugin.php on line 12
Типичные причины:
- Ошибка в PHP-коде — опечатка в названии файла, класса, функции. Часто случается после копирования кода из интернета без адаптации.
- После обновления Joomla или WordPress плагин оказался несовместим с новой версией PHP.
- Файл был удалён или повреждён при загрузке по FTP (бинарный режим вместо текстового).
- Не хватает памяти: в логе будет
PHP Fatal error: Allowed memory size of ... bytes exhausted.
Алгоритм исправления:
- В логе ошибок находим конкретный файл и строку. В примере выше это
/var/www/site/plugins/system/customplugin/customplugin.php:12. - Проверяем, существует ли файл:
ls -la /var/www/site/plugins/system/customplugin/customplugin.php. - Если файла нет — восстанавливаем из бэкапа или переустанавливаем плагин.
- Если файл есть — открываем его на строке 12 и смотрим, что там происходит. В примере — не найден другой файл, на который ссылается require_once.
- Если ошибка в памяти — увеличиваем
memory_limitв php.ini (например, до 256M или 512M). - В Joomla: если ошибка появилась после установки расширения, переименуйте папку плагина через FTP — система его отключит, сайт заработает, а вы сможете спокойно разбираться.
3. Ошибка 403: Forbidden
Как это выглядит на сайте: пользователь видит «403 Forbidden» или «Access Denied». Страница существует, но сервер не отдаёт её.
Пример строки лога ошибок:
[Mon Jul 08 15:30:44.567890 2026] [error] [client 109.188.126.55] client denied by server configuration: /var/www/site/administrator/
Типичные причины:
- Неправильные права доступа к файлу или директории. Например, после восстановления из бэкапа права на файлах стали 600, а должны быть 644.
- В .htaccess или nginx.conf настроено ограничение доступа по IP, а ваш IP изменился.
- Защита административной панели Joomla через пароль в .htaccess, и файл .htpasswd недоступен.
- Включён плагин безопасности (например, Akeeba Admin Tools в Joomla), который блокирует доступ по определённым правилам.
Алгоритм исправления:
- Проверить права:
ls -la /var/www/site/administrator/. Типичные права: 755 для директорий, 644 для файлов. - Если права неверные — исправить:
chmod 755 /var/www/site/administrator/. - Проверить .htaccess на наличие директив Deny, Allow, Require. Временно закомментировать подозрительные строки.
- В Joomla: проверить плагины системы безопасности, временно отключить их через FTP (переименовать папку плагина).
4. Ошибка 502/503: Backend не отвечает
Как это выглядит на сайте: «502 Bad Gateway» или «503 Service Unavailable». Сайт не открывается, хотя сервер работает.
Пример строки лога ошибок Nginx:
2026/07/08 16:45:22 [error] 2345#2345: *12345 connect() failed (111: Connection refused) while connecting to upstream, client: 178.67.92.33, server: site.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:9000/"
Типичные причины:
- PHP-FPM упал или не запущен. На практике часто случается после перезагрузки сервера, когда PHP-FPM не прописан в автозагрузку.
- В конфигурации Nginx указан неверный порт для upstream. Например, PHP-FPM слушает порт 9001, а в конфиге указан 9000.
- База данных MySQL/MariaDB не запущена, и запросы к ней вызывают ошибку подключения.
Алгоритм исправления:
- Проверить, запущен ли PHP-FPM:
systemctl status php7.4-fpm(версия PHP зависит от вашей системы). - Если не запущен:
systemctl start php7.4-fpm. - Проверить конфигурацию Nginx:
nginx -t(проверка синтаксиса), затем найти директивуfastcgi_pass— она должна указывать на правильный сокет или порт PHP-FPM. - Если проблема с базой данных — проверить:
systemctl status mysql(или mariadb).
5. Ошибка 408/504: Timeout
Как это выглядит на сайте: страница долго грузится, а затем обрывается с ошибкой таймаута.
Пример строки лога ошибок:
2026/07/08 17:30:55 [error] 3456#3456: *23456 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 46.39.53.19, server: site.ru, request: "POST /administrator/index.php?option=com_installer HTTP/1.1", upstream: "http://127.0.0.1:8080/..."
Типичные причины:
- Долгий запрос к базе данных без индексов на больших таблицах. Классическая ситуация: интернет-магазин с десятками тысяч товаров и запросом, который перебирает всю таблицу.
- Генерация большого PDF или Excel-файла на лету.
- Внешний API отвечает слишком медленно, а скрипт ждёт его без ограничения времени.
- На сервере запущено слишком много процессов, и до вашего запроса очередь не доходит.
Алгоритм исправления:
- Увеличить таймаут в конфигурации: для Apache —
Timeout 300в httpd.conf, для Nginx —proxy_read_timeout 300илиfastcgi_read_timeout 300в конфиге сайта. - Оптимизировать запрос: добавить индексы в базу данных, переписать медленный SQL.
- Проверить нагрузку на сервер через
topилиhtop. Если load average зашкаливает — найти и оптимизировать прожорливые процессы.
6. Ошибки безопасности: сканирование, подбор паролей
Как это выглядит в логах доступа: множество запросов к типовым уязвимым путям или повторяющиеся POST-запросы к формам входа.
Примеры строк:
45.33.32.31 - - [08/Jul/2026:18:10:01 +0300] "GET /wp-admin/ HTTP/1.1" 404 245 "-" "Mozilla/5.0"
185.176.27.132 - - [08/Jul/2026:18:10:12 +0300] "POST /administrator/index.php HTTP/1.1" 200 356 "-" "Mozilla/5.0"
91.240.118.22 - - [08/Jul/2026:18:10:23 +0300] "GET /.env HTTP/1.1" 404 162 "-" "python-requests/2.19.1"
Признаки атаки:
- Множество запросов с одного IP к /wp-login.php, /administrator/, /phpmyadmin, /.env за короткий промежуток времени.
- User-Agent содержит «python-requests», «nikto», «sqlmap» — инструменты автоматического сканирования.
- POST-запросы к форме входа с разными паролями — видно по времени между запросами (доли секунды).
Алгоритм действий:
- Заблокировать IP через .htaccess (Apache):
Deny from 45.33.32.31или через nginx.conf:deny 45.33.32.31;. - В Joomla: установить и настроить Akeeba Admin Tools — он автоматически блокирует IP после нескольких неудачных попыток входа.
- В WordPress: установить Wordfence или Limit Login Attempts Reloaded.
- Сменить пароли администраторов на сложные, сгенерированные менеджером паролей.
- Настроить защиту через robots.txt — закрыть от индексации служебные директории (хотя боты-сканеры его игнорируют, это всё равно полезно).
Практические инструменты для анализа логов
Ручной просмотр логов через cat и less быстро утомляет, особенно когда файл весит сотни мегабайт. Рассмотрим инструменты от простых команд до промышленных систем.
1. Простые команды (для новичков)
Эти команды доступны на любом Linux-сервере и покрывают 90% задач по анализу логов.
tail -n 100 /var/log/apache2/error.log— последние 100 строк лога ошибок. Первое, что я запускаю, когда сайт падает.tail -f /var/log/apache2/access.log— просмотр в реальном времени. Откройте в одном окне терминала, в другом — перезагрузите проблемную страницу, и вы увидите запись мгновенно.grep " 500 " /var/log/nginx/access.log— фильтрация по коду 500. Пробелы вокруг 500 важны, чтобы не захватить строки с числами 5000, 5001 и т.д.grep -c " 404 " /var/log/apache2/access.log— подсчёт количества 404 ошибок. Полезно для быстрой оценки масштаба проблемы.less /var/log/apache2/error.log— просмотр с возможностью скроллинга и поиска (нажмите / и введите искомое слово).awk '{print $1, $7, $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20— топ-20 URL по количеству запросов с IP-адресом и кодом ответа.
2. Веб-интерфейсы
GoAccess — простой анализатор логов с веб-интерфейсом. Устанавливается из репозиториев: apt install goaccess. Запуск в реальном времени: goaccess /var/log/apache2/access.log -o /var/www/html/report.html --real-time-html. После этого отчёт будет доступен по адресу http://ваш-сайт/report.html. Показывает топ URL, коды ответов, источники трафика, распределение по времени суток.
AWStats — более старый, но надёжный инструмент. Устанавливается через apt install awstats. Генерирует статические HTML-отчёты, которые удобно смотреть раз в день. Не подходит для оперативной диагностики, но даёт отличную картину посещаемости за периоды.
3. Мощные системы для профессионалов
Kibana + Elasticsearch — связка для централизованного сбора и визуализации логов. Подходит, когда у вас несколько серверов и объём логов исчисляется гигабайтами в день. Настройка требует времени: нужно поднять Elasticsearch для хранения, Logstash или Filebeat для сбора и Kibana для визуализации. Но результат того стоит: можно строить дашборды, настраивать алерты, искать по любым полям за секунды.
CloudWatch Logs (AWS) — для проектов, размещённых в Amazon Web Services. Логи автоматически собираются с EC2-инстансов, можно настраивать метрики и алерты. Удобно, что всё работает из коробки, не нужно поднимать отдельные сервисы.
Google Cloud Logging — аналогично для Google Cloud. Интегрируется с другими сервисами Google и поддерживает мощный язык запросов.
Чек-лист: как быстро найти проблему в логах
Когда сайт упал, а клиент или начальник требует немедленного решения, нет времени методично перечитывать документацию. Действуйте по этому алгоритму — он проверен на десятках реальных инцидентов.
- Определите тип ошибки. Посмотрите на страницу в браузере или спросите пользователя — 404, 500, 403 или другой код. Это сразу сужает круг поиска.
- Найдите логи. Откройте панель хостинга или подключитесь по SSH. Если работаете с VPS — перейдите в /var/log/apache2/ или /var/log/nginx/.
- Отфильтруйте по коду ошибки. Для ошибок 404, 500, 502, 503 —
grep " НОМЕР " /путь/к/access.log | tail -20. Вы увидите последние запросы с этим кодом. - Посмотрите логи ошибок за тот же период.
tail -50 /var/log/apache2/error.log. В 80% случаев здесь будет прямое указание на файл и строку. - Определите причину. Сопоставьте записи из access.log и error.log. Например, access.log показывает 500 на странице /checkout, а error.log — фатальную ошибку в файле плагина оплаты.
- Исправьте проблему. Если ошибка в коде — исправляйте код. Если в базе данных — проверяйте запущен ли MySQL. Если в правах доступа — меняйте chmod.
- Проверьте. Перезагрузите проблемную страницу. Если ошибка ушла — хорошо. Если нет — повторите с шага 3, вероятно, есть несколько проблем одновременно.
- Задокументируйте. Запишите, что было сделано и почему. Через полгода, когда ситуация повторится, вы скажете себе спасибо.
Типовые ошибки и как их избежать
За годы работы с логами я регулярно наступал на одни и те же грабли. Лучше учиться на чужих ошибках.
1. Просмотр логов без фильтрации
Ситуация: открываете access.log размером 2 ГБ и пытаетесь скроллить в поисках ошибок. Это бессмысленно: вы потратите часы и пропустите нужные строки.
Как правильно: всегда используйте grep для фильтрации по коду ошибки или временному периоду. Например, grep "08/Jul/2026:18:" access.log | grep " 500 " — все 500-е ошибки за конкретный час.
2. Неправильное понимание контекста ошибки
Ситуация: видите «File not found», удаляете ссылку на несуществующий файл из кода, а ошибка остаётся. На самом деле файла нет на диске, потому что плагин не доустановился.
Как правильно: всегда проверяйте контекст. Если в логе указан путь к файлу — проверьте, существует ли он физически: ls -la /путь/к/файлу. Часто проблема не в том, что файл не найден, а в том, что путь указан неверно.
3. Игнорирование прав доступа
Ситуация: после восстановления сайта из бэкапа половина страниц выдаёт 403. Вы проверяете код, конфигурацию, перезагружаете сервер — ничего не помогает. А проблема в том, что права на файлах сбились при копировании.
Как правильно: всегда проверяйте права, особенно после операций с файловой системой. Команда ls -la /var/www/site/ покажет владельца и маску доступа. Типичные значения: владелец www-data (или nginx), права 755 на директории, 644 на файлы.
4. Неправильная настройка времени ожидания
Ситуация: страница импорта товаров падает с ошибкой 504, хотя на старом сервере работала. Разница в том, что на новом сервере таймаут Nginx установлен в 30 секунд, а импорт занимает минуту.
Как правильно: для долгих операций увеличивайте таймауты: в Apache — директива Timeout, в Nginx — fastcgi_read_timeout и proxy_read_timeout. Но не злоупотребляйте: если таймаут 600 секунд, а запросов много, они быстро забьют все доступные слоты.
5. Игнорирование безопасности
Ситуация: сайт работает медленно, вы смотрите нагрузку — она под 100%. Открываете логи доступа, а там сотни запросов в минуту от ботов, которые перебирают пароли к /wp-login.php.
Как правильно: регулярно просматривайте access.log на предмет подозрительной активности. Настройте автоматическую блокировку IP после нескольких неудачных попыток входа (через fail2ban или плагины безопасности CMS).
FAQ: частые вопросы о логах сервера
Где найти логи на хостинге с панелью ISPmanager?
В разделе «Логи» → «Логи ошибок Apache/Nginx» и «Логи посещений». Если сайт работает на связке Nginx + Apache — смотрите оба лога.
Как посмотреть только ошибки 500?
grep " 500 " /var/log/apache2/access.log — пробелы вокруг 500 обязательны, иначе grep найдёт все строки с «500» в любом контексте.
Что делать, если лог слишком большой?
Используйте tail для просмотра последних записей: tail -n 500 access.log | grep "ошибка". Либо фильтруйте по времени через awk: awk '$4 >= "[08/Jul/2026:18:"' access.log.
Как найти, какой файл вызвал ошибку 500?
Смотрите error.log — там будет строка вида: PHP Fatal error: ... in /var/www/site/components/com_example/example.php:87. Файл и строка указаны после «in».
Почему я не вижу ошибок в логах, хотя сайт не работает?
Возможно, ошибка происходит на уровне, который не пишется в стандартные логи: например, проблема с DNS, фаервол блокирует запросы, или сайт работает через CDN и ошибка на стороне CDN, а не сервера. Проверьте все звенья цепочки.
Как быстро проанализировать, какие страницы чаще всего выдают 404?
grep " 404 " access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 — топ-20 URL с 404 ошибкой. Полезно для поиска битых ссылок.
Можно ли автоматически получать уведомления о критических ошибках?
Да. Настройте алерты в CloudWatch (AWS) или Google Cloud Logging, либо используйте fail2ban с действием отправки email, либо напишите простой скрипт, который парсит error.log и отправляет уведомление в Telegram при появлении строк с «PHP Fatal».