Почему в логах ошибок Apache не сохраняются записи об ошибке 404

В правильно настроенном и работающем веб-сервере Apache можно столкнуться с интересной ситуацией — большинство сообщений об ошибках сохраняются в логи ошибок, но информация о запросах, которые вернули статус ответа 404, в журнал ошибок не попадает.

При этом если проверить журнал доступа, то там запросы со статусом 404 видны.

Вы можете ещё больше запутаться из-за того, что записи в логи ошибок со статусом 404 добавляются для PHP скриптов (если скрипт не найден), но не добавляются для HTML файлов, изображений, файлов JavaScript, каскадных таблиц стилей и т. д. Ситуация может показаться весьма странной.

Чтобы в ней разобраться, нужно знать о директиве веб-сервера Apache с именем LogLevel.

Вместе с ErrorLog, которая определяет путь до файла журнала, куда будут записываться ошибки, LogLevel является второй важной директивой, которая определяет уровень серьёзности ошибок, которые попадают в файл.

Уровни ошибок бывают следующими: https://hackware.ru/?p=9621#24

У директивы LogLevel имеется значение по умолчанию, оно следующее:

LogLevel warn

Давайте посмотрим на пример ошибки, когда не найден статичный файл (HTML, .txt, .js и т. д.):

[Mon Aug 19 05:21:07.846623 2019] [core:info] [pid 29057] [client 2604:a880:2:d0::651:5001:50864] AH00128: File does not exist: /srv/http/suip/.well-known/security.txt

Обратите внимание на часть core:info она означает, что данное сообщение исходит от ядра Apache и, главное, его уровень info! То есть, чтобы такие сообщения попадали в журнал ошибок, нужно установить значение LogLevel на уровень info следующим образом:

LogLevel info

После этого нужно перезагрузить веб-сервер и теперь запросы, завершившиеся статусом ответа 404, также попадут в журнал ошибок Apache.

Может возникнуть вопрос — почему тогда другие сообщения об ошибках, например, о том, что не найден PHP скрипт, всё-таки попадали в логи ошибок? Давайте посмотрим на пример записи из журнала ошибок Apache:

[Mon Aug 19 05:26:02.847140 2019] [php7:error] [pid 29256] [client 115.28.240.215:1920] script '/srv/http/suip/wp-login.php' not found or unable to stat

Обратите внимание на поле php7:error. Оно означает, что данное сообщение сгенерировано модулем php7 и что этот модуль сам присвоил ему уровень error. Уровень error выше установленного по умолчанию уровня warn, по этой причине сообщения об отсутствующих .php файлах по умолчанию попадают в журнал ошибок, а сообщения об отсутствующих других файлов — нет.

Что можно сказать о следующей записи?

[Mon Aug 19 05:11:51.422362 2019] [authz_core:error] [pid 29056] [client 144.76.28.10:57801] AH01630: client denied by server configuration: /srv/http/suip/ru/, referer: https://suip.biz/ru/?act=proxy1

Причина появления этой ошибки в том, что запрос от пользователя отклонён конфигурацией сервера (забанен по IP). Данное сообщение сгенерировано модулем authz_core, который присвоил ему уровень error. Это означает, что даже при значении директивы LogLevel установленном на warn (значение по умолчанию), это сообщение всё равно попадёт в журнал ошибок Apache.

Итак, базовое представление о директивах веб-сервера, отвечающих за ведение журнала ошибок, позволяет решить «мистическую» проблему, при которой некоторые записи попадают в журнал, а некоторые — нет.

Чтобы продолжить дальнейшее изучение настроек логов Apache, рекомендуются статьи:

Добавить комментарий

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