Регистрация HTTP-запросов в Apache: Краткое руководство
13:14, 27.07.2026
Основы ведения журналов Apache
Записи в журнале Apache содержат информацию об ответах Apache, запросах с других компьютеров и внутренних действиях сервера. В этом руководстве мы рассмотрим основы ведения журналов, а именно типы журналов, место их хранения и даже способы их интерпретации. Кроме того, мы поделимся информацией о настройке модулей и настройке пользовательских форматов журналов.
Категории журналов Apache
Журналы Apache делятся на две категории: журналы ошибок и журналы доступа.
Журналы доступа
Журналы доступа содержат данные о запросах, поступающих на сервер. Такой журнал обычно содержит информацию о просматриваемой веб-странице, о том, был ли данный запрос успешным, и сколько времени потребовалось для получения результатов.
Журналы ошибок
Как и следует из названия, журналы ошибок содержат данные об ошибках, возникших при обработке сервером конкретного запроса. Как и в журналах доступа, в них также указывается точное время поступления запроса и IP-адрес. Журналы ошибок позволяют вам узнавать о возникших проблемах. Например, если файл отсутствует,
Расположение файлов журналов
По умолчанию журналы ошибок и журналы доступа хранятся на сервере отдельно. В зависимости от используемой ОС расположение может немного отличаться.
Настройка параметров ведения журналов Apache
Apache предлагает чрезвычайно гибкие настройки ведения журналов, с помощью которых можно настроить поведение ведения журналов как для каждого виртуального хоста, так и глобально. Поведение ведения журналов можно изменить с помощью нескольких директив. Итак, давайте рассмотрим наиболее распространённые директивы: формат журнала и уровень журнала.
Использование директивы LogLevel
Директива LogLevel необходима для определения минимального уровня серьезности событий. Уровень серьезности указывает на важность конкретного события и может варьироваться. Например, уровень серьезности может быть установлен как Trace8 или Emerg. Уровень Emerg обозначает события, которые могут привести к нестабильности, а Trace8 — трассировочные сообщения. Например, LogLevel crit игнорирует все уровни, кроме Emerg, Alert и Crit.
Определение пользовательских форматов журналов
Директива LogFormats отвечает за форматирование и расположение событий в журнале. По умолчанию используется формат CLF (Common Format), но вы также можете использовать собственную строку форматирования.
Директива CustomLog также необходима для изменения расположения файлов журналов. В большинстве систем Linux журналы обычно записываются в каталог var/log/httpd или var/log/apache2. Кроме того, вы можете изменить строку после имени файла, чтобы конкретные изменения вносились только в конкретный файл.
Полный список полей можно найти в документации по журналам. Для мониторинга активности сервера и оперативного устранения возникающих проблем следует использовать следующие 5 полей:
- %T — указывает время, затраченное на обработку запроса. Это очень полезное поле, так как позволяет измерить скорость работы сайта. Чтобы получить те же результаты, но в микросекундах, вместо T следует использовать D.
- %>s — с помощью этого параметра можно проверить статус запроса после какого-либо внутреннего перенаправления.
- %a — показывает IP-адрес, с которого был отправлен запрос. Это означает, что вы сможете гораздо проще идентифицировать трафик.
- %{ID}e — ID обозначает идентификатор запроса, то есть каждый запрос имеет свой уникальный идентификатор. Это можно использовать для отслеживания запросов между сервером веб-приложения и Apache.
- %U — путь URL, но без дополнительных параметров, например, строки запроса.
Присвоение псевдонимов логам
Присвоение псевдонимов логам чрезвычайно полезно, особенно в случае использования различных файлов логов для нескольких виртуальных хостов. Присвоенное псевдоним можно использовать с директивой CustomLog, чтобы журналы записывались в указанном формате. Это означает, что вы можете задавать отдельные форматы журналов для разных файлов журналов и при этом не тратить время на повторное определение формата каждый раз.
Ведение журналов в формате JSON
Хранение журналов в обычном текстовом формате значительно упрощает проверку файлов в случае необходимости. Конечно, такой формат удобен для обычного чтения, но обработка таких данных с помощью инструментов управления логами будет затруднительна, поскольку эти решения имеют свой собственный формат. Конечно, большинство инструментов управления используют формат Apache по умолчанию, но если это не так, вам стоит рассмотреть JSON.
JSON — это аббревиатура от JavaScript Object Notation и отличный формат для хранения структурированных данных. JSON весьма полезен, поскольку позволяет хранить практически любую структуру или тип данных. Кроме того, этот формат отлично подходит для самодокументирования информации. Среди основных типов, поддерживаемых этим форматом, можно выделить массивы, числа, строки, значение null и булевы операторы.
Реализация ротации логов
Проблемы, которые могут возникать с логами доступа или другими логами, заключаются в чрезмерном потреблении дискового пространства или сложностях с управлением. Благодаря реализации ротации логов можно решить эту проблему.
Существует специальная программа rotatelogs, которая помогает осуществлять ротацию журналов в зависимости от их размера и времени. Стандартная команда logrotate также является хорошим вариантом, с которого можно начать. В большинстве систем Linux у Apache есть файл конфигурации.
Файл конфигурации по умолчанию в Debian 11 находится в /etc/logrotate.d/apache2. Вы можете изменить этот файл, чтобы настроить ротацию журналов Apache. Давайте разберем значение каждого раздела этого файла конфигурации:
- Отсутствие параметра «ok» не вызывает никаких проблем, если файл журнала указан.
- /var/log/apache2/*.log — означает, что конфигурация будет применяться ко всем файлам с расширением .log в указанном месте. После { указываются все директивы для logrotate, а затем используется }.
- Compress означает, что сжатие применяется к ротируемым файлам журналов.
- Если указано «daily», это означает, что ротация происходит ежедневно; также вы можете изменить это значение на «yearly», «weekly» или «monthly».
- «Rotate 14-» означает, что сохраняются 14 файлов журналов, а остальные удаляются. В случае использования ежедневной ротации у вас будет сохранено примерно 2 недели журналов.
- «Delaycompress» означает, что недавние файлы остаются в несжатом виде, а самые старые будут сжаты.
- Notifempty — означает, что все пустые файлы не подлежат ротации.
- Sharedscripts — скрипты postrotate не будут запускаться, пока все журналы не будут ротированы.
- Create 640 root adm — означает, что после ротации будут созданы файлы с правами доступа 640.
Настройки журналов по умолчанию для виртуальных хостов
Виртуальные хосты необходимы для запуска нескольких веб-сайтов на одном сервере. Для каждого виртуального хоста можно указать отдельную конфигурацию ведения журналов. Это означает, что вы можете настроить запись журналов каждого сайта в отдельный каталог. Или же вы можете оставить глобальную конфигурацию по умолчанию.
Вот пример, в котором журналы записываются в отдельный файл access.log:
<VirtualHost *:80>
ServerName skills.com (пример домена)
ServerAdmin webmaster@skills.com
DocumentRoot /var/www/skills.com
LogLevel info ssl:warn
ErrorLog /var/www/skills.com/logs/error.log
CustomLog /var/www/skills.com/logs/access.log example
</VirtualHost>
Debian, Ubuntu и Linux Mint
В системах Debian конфигурация шифрования веб-сайтов по умолчанию с помощью SSL/TLS находится в файле /etc/apache2/sites-available/default-ssl.conf, а конфигурация виртуального хоста для незашифрованных веб-сайтов — в файле /etc/apache2/sites-available/000-default.conf.
Таблица директив по умолчанию
Параметр/Директива | Файл конфигурации | Значение/Путь |
AccessLog | /etc/apache2/sites-available/000-default.conf | CustomLog ${APACHE_LOG_DIR}/access/log combined |
SUFFIX* | /etc/apache2/envvars | Условную логику можно проверить в файле конфигурации |
LogLevel | /etc/apache2/apache2.conf | warn |
APACHE_LOG_DIR** | /etc/apache2/envvars | Export =/var/log/apache2$SUFFIX |
ErrorLog | /etc/apache2/apache2.conf | ErrorLog${APACHE_LOG_DIR}/error.log |
LogFormat | /etc/apache2/apache2.conf | “%v:%p %h %l %u %t”%r”%>s %0 “%{Referer}i” „%{User-Agent}i”” |
CustomLog | /etc/apache2/conf-available/other-vhosts-access-log.conf | ${APACHE_LOG_DIR}/other_vhosts_access.log vhost_combined |
Red Hat, Fedora и CentOS
В Red Hat и аналогичных системах файлы конфигурации виртуальных хостов находятся в каталоге /etc/httpd/conf.d, а главный файл конфигурации — в каталоге /etc/httpd/conf/httpd.conf.
Таблица директив по умолчанию
Директива | Файл конфигурации | Значение/Путь |
LogLevel | /etc/httpd/conf/httpd.conf | warn |
AccessLog | /etc/httpd/conf/httpd.conf | /var/log/httpd/access_log |
LogFormat (log_config_module) | /etc/httpd/conf/httpd.conf | “%h %l %u %t”%r”%>s %b “%{Referer}i” „%{User-Agent}i”” |
ErrorLog | /etc/httpd/conf/httpd.conf | /var/log/httpd/error_log |
CustomLog (log_config_module) | /etc/httpd/conf/httpd.conf | «logs/access_log» combined |
LogFormat (загруженный модуль logio_module) | /etc/httpd/conf/httpd.conf | «%h %l %u %t»%r»%>s %b «%{Referer}i» „%{User-Agent}i” %l%0»combinedio |
OpenSUSE
В системе OpenSUSE конфигурация для веб-сайтов с SSL/TLS находится в файле /etc/apache2/default-vhost-ssl.conf, а для незашифрованных — в файле /etc/apache2/default-vhost.conf.
Таблица директив по умолчанию
Директива | Файл конфигурации | Значение/Путь |
LogLevel | /etc/apache2/sysconfig.d/global.conf | warn |
AccessLog | /etc/apache2/sysconfig.d/global.conf | /var/log/apache2/access_log |
LogFormat (log_config_module) | /etc/apache2/mod_log_config.conf | “%h %l %u %t”%r”%>s %b“ |
ErrorLog | /etc/apache2/httpd.conf | /var/log/apache2/error_log |
LogFormat (logio_module) | /etc/apache2/mod_log_config.conf | «%h %l %u %t»%r»%>s %b«%{Referer}i» „%{User-Agent}i” %l%0»combinedio |
CustomLog (log_config_module) | /etc/apache2/sysconfig.d/global.conf | /var/log/apache2/access_log combined |
LogFormat (mod_ssl) | /etc/apache2/mod_log_config.conf | «%t%h%{SSL_PROTOCOL}x %{SSL_CIPHER}x»%r» %b» ssl_commonLogformat”%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x “%r”%b “%{Referer}i” “%{User-Agent}i””ssl_combined |
Модули Apache для ведения журналов
Существует несколько модулей, которые могут значительно помочь в изменении поведения ведения журналов. Основываясь на наших знаниях, полученных при настройке сервера Apache, мы поделимся важной информацией о полезных модулях Apache для ведения журналов.
mod_log_config
Это, пожалуй, самый базовый модуль, о котором мы уже говорили в этой статье.
mod_log_debug
Этот модуль может отсутствовать не во всех дистрибутивах Apache, но он полезен для ведения журнала отладочных сообщений. Например, этот модуль можно использовать для записи сообщений от определённых клиентов, регистрации событий по определённому URL-пути и т. д.
Например:
<Location /path/to/some/directory>
LogMessage "Запрос на /path/to/directory поступил от"
${REMOTE_ADDR}
</Location>
mod_log_forensic
С помощью этого модуля можно вести регистрацию событий до и после обработки запроса. После включения этого модуля можно использовать ключевые слова для определения того, какой файл журнала является криминалистическим. Также можно использовать %{forensic-id} в различных строках, чтобы добавлять данные для криминалистического анализа в обычные журналы.
Вот пример:
<VirtualHost *:80>
ServerName skills.com (это пример домена)
ServerAdmin webmaster@skills.com
DocumentRoot /var/www/skills.com
LogLevel info ssl:warn
ErrorLog /var/www/skills.com/logs/error.log
CustomLog /var/www/skills.com/logs/access.log example
CustomLog /var/www/skills.com/logs/forensic.log forensic
</VirtualHost>
mod_logio
Данный модуль позволяет регистрировать количество байтов, полученных или отправленных в рамках каждого запроса. Этот модуль также учитывает изменения размера, связанные с шифрованием TLS/SSL, и обычно включается в соответствии с настройками по умолчанию.
mod_filter
Этот модуль помогает отфильтровывать определённые запросы на основе заданного фильтра. Контекстный фильтр, предоставляемый этим модулем, учитывает конфигурацию виртуальных хостов, конфигурацию Apache, файлы .htaccess и многое другое.
Этот модуль обычно включён по умолчанию, но вам, возможно, понадобится его включить.
mod_unique_id
Этот модуль необходим для формирования уникального идентификатора для каждого запроса. Идентификатор записывается в журнал доступа. Он передаётся обработчику приложения с помощью переменной среды UNIQUE_ID. Таким образом, разработчикам становится гораздо проще отслеживать запросы.