
Apache — кроссплатформенный HTTP-сервер с открытым исходным кодом. Он обладает множеством мощных функций, которые можно расширить с помощью множества модулей. При управлении веб-серверами Apache одной из наиболее частых задач, которые вам придётся выполнять, является проверка лог-файлов.
Знание того, как настраивать и читать журналы, очень полезно при устранении неполадок сервера или приложения, поскольку они предоставляют подробную отладочную информацию.
Apache записывает записи своих событий в два типа журналов: журналы доступа и журналы ошибок. Журналы доступа содержат информацию о клиентских запросах, а журналы ошибок — информацию о проблемах сервера и приложений.
В этой статье описывается, как настроить и читать журналы доступа и ошибок Apache.
Настройка журнала доступа
Веб-сервер Apache генерирует новое событие в журнале доступа для всех обработанных запросов. Каждая запись о событии содержит временную метку и различную информацию о клиенте и запрошенном ресурсе. Журналы доступа показывают местоположение посетителя, посещённую им страницу, продолжительность пребывания на странице и многое другое.
Директива CustomLog определяет местоположение файла журнала и формат регистрируемых сообщений.
Самый простой синтаксис директивы CustomLog выглядит следующим образом:
CustomLog log_file format [condition];
Путь log_file может быть задан как относительно ServerRoot , так и полным путём к файлу журнала. Сообщения журнала также можно передавать в другую программу с помощью символа | .
Второй аргумент, format определяет формат сообщений журнала. Это может быть как явное определение формата, так и псевдоним, заданный директивой LogFormat .
LogFormat "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined CustomLog logs/access.log combined
CustomLog logs/access.log "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i""
Чтобы избежать повторения одного и того же кода несколько раз, лучше определить директиву LogFormat и использовать ее в качестве псевдонима в директиве CustomLog .
Полный список всех строк формата и модификаторов можно найти в документации модуля «mod_log_config» .
Третий аргумент [condition] необязателен и позволяет записывать сообщения в журнал только при выполнении определённого условия. Обычно это делается с помощью переменных окружения. Условие можно отменить с помощью символа ! .
Например, если вы хотите исключить запросы к файлам CSS, которые нужно записать в файл журнала, вы можете использовать следующее:
SetEnvIf Request_URI .css$ css-file CustomLog logs/access.log custom env=!css-file
Чтобы изменить формат журнала, можно либо определить новую директиву LogFormat , либо переопределить формат по умолчанию. Обычно лучше определить новый формат.
Хотя журнал доступа предоставляет очень полезную информацию, он занимает место на диске и может повлиять на производительность сервера. Если на вашем сервере мало ресурсов, а ваш сайт загружен, возможно, стоит отключить журнал доступа.
Для этого просто закомментируйте или удалите директиву CustomLog из разделов конфигурации основного сервера и виртуального сервера.
Если вы хотите отключить журнал доступа только для одного виртуального хоста, задайте первому аргументу директивы CustomLog значение /dev/null :
CustomLog /dev/null combined
Настройка журнала ошибок
Apache записывает сообщения об ошибках приложения и общих ошибках сервера в файл журнала ошибок. Если в вашем веб-приложении возникают ошибки, журнал ошибок — это первое место, с которого следует начать устранение неполадок.
Директива ErrorLog определяет местоположение имени журнала ошибок. Она имеет следующий вид:
ErrorLog log_file
Если путь к log_file не абсолютный, он указывается относительно ServerRoot . Сообщения об ошибках также можно передать в другую программу с помощью символа | .
Параметр LogLevel задаёт уровень ведения журнала. Ниже приведены уровни, отсортированные по степени важности (от самого низкого к самому высокому):
-
trace1—trace8— Трассировка сообщений. -
debug— Отладочные сообщения. -
info— Информационные сообщения. -
notice— Уведомления. -
warn— Предупреждения. -
error— Ошибки при обработке запроса. -
crit— критические проблемы. Требуют немедленного действия. -
alert— Оповещения. Необходимо немедленно принять меры. -
emerg— Аварийная ситуация. Система находится в непригодном для использования состоянии.
Каждый уровень журнала включает в себя более высокие уровни. Например, если установить уровень журнала « warn , Apache также будет записывать сообщения об error , crit , alert и emerg .
Если параметр LogLevel не указан, по умолчанию используется значение warn . Рекомендуется установить уровень не ниже crit .
Директива ErrorLogFormat определяет формат журнала ошибок. В большинстве дистрибутивов Linux сервер Apache использует формат по умолчанию, которого достаточно для большинства случаев.
Виртуальные хосты и глобальное ведение журнала
Поведение журнала и местоположение файлов можно настроить как глобально, так и для каждого виртуального хоста.
Затем в контексте основного сервера задаются директивы CustomLog или ErrorLog , и сервер записывает все сообщения журнала в те же файлы журнала доступа и ошибок. В противном случае, если директивы помещены в блок , в указанный файл записываются только сообщения журнала для этого виртуального хоста.
Директива журнала, заданная в блоке , переопределяет директиву, заданную в контексте сервера.
Сообщения журнала виртуальных хостов без директив CustomLog или ErrorLog будут записываться в глобальные журналы сервера.
Для лучшей читаемости рекомендуется создавать отдельные файлы журнала доступа и ошибок для каждого виртуального хоста. Вот пример:
*:80 > ServerName example.com ServerAlias www.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/public LogLevel warn ErrorLog /var/www/example.com/logs/error.log CustomLog /var/www/example.com/logs/access.log combined
После каждого изменения файла конфигурации необходимо перезапустить службу Apache , чтобы изменения вступили в силу.
Расположение файлов журнала
По умолчанию в дистрибутивах на базе Debian , таких как Ubuntu , журналы доступа и ошибок находятся в каталоге /var/log/apache2 . В CentOS файлы журналов находятся в каталоге /var/log/httpd .
Чтение и понимание файлов журналов Apache
Файлы журналов можно открывать и анализировать с помощью стандартных команд, таких как cat , less , grep , cut , awk и т. д.
Вот пример записи из файла журнала доступа, в котором используется формат журнала combine Debian:
192.168.33.1 - - [08/Jan/2020:21:39:03 +0000] "GET / HTTP/1.1" 200 6169 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
Давайте разберем, что означает каждое поле записи:
-
%h—192.168.33.1— Имя хоста или IP-адрес клиента, отправившего запрос. -
%l—-— Имя удалённого журнала. Если имя пользователя не задано, в этом поле отображается-. -
%u—-— Если запрос аутентифицирован, отображается имя удаленного пользователя. -
%t—[08/Jan/2020:21:39:03 +0000]— Локальное время сервера. -
"%r"—"GET / HTTP/1.1"— первая строка запроса. Тип запроса, путь и протокол. -
%>s—200— Конечный код ответа сервера. Если символ>не используется и запрос был перенаправлен внутри сервера, будет отображаться статус исходного запроса. -
%O—396— Размер ответа сервера в байтах. -
"%{Referer}i"—"-"— URL реферала. -
"%{User-Agent}i"—Mozilla/5.0 ...— Пользовательский агент клиента (веб-браузер).
Используйте команду tail для просмотра файла журнала в режиме реального времени:
tail -f access.log
Заключение
Файлы журналов предоставляют вам полезную информацию о проблемах сервера и о том, как посетители взаимодействуют с вашим сайтом.
Apache имеет очень гибко настраиваемую систему журналирования, которая позволяет вам настраивать журналы доступа и ошибок в соответствии с вашими потребностями.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства
- Защитите Apache с помощью Let's Encrypt в Ubuntu 20.04
- Как принудительно включить HTTPS с помощью .htaccess
- Как настроить виртуальные хосты Apache в Ubuntu 20.04
- Как установить Apache в Ubuntu 20.04
- Как настроить виртуальные хосты Apache в Debian 10
- Как настроить виртуальные хосты Apache на CentOS 8
- Как установить и настроить Redmine на CentOS 8