Раздел 2. Использование HTTP-сервера Apache RU EN Пункт 13. Файлы журналов Чтобы эффективно управлять веб-сервером, необходимо получать отзывы об активности и производительности сервера, а также о любых проблемах, которые могут возникнуть. HTTP-сервер Apache предоставляет очень широкие и гибкие возможности ведения журналов. В этом документе описывается, как настроить возможности ведения журнала и как понять, что содержится в журналах. Обзор
HTTP-сервер Apache предоставляет множество различных механизмов для регистрации всего, что происходит на вашем сервере, от первоначального запроса через процесс сопоставления URL-адресов до окончательного разрешения соединения, включая любые ошибки, которые могли возникнуть в процессе. В дополнение к этому сторонние модули могут предоставлять возможности ведения журнала или вводить записи в существующие файлы журнала, а такие приложения, как программы CGI, сценарии PHP или другие обработчики, могут отправлять сообщения в журнал ошибок сервера. В этом документе мы обсуждаем модули ведения журнала, которые являются стандартной частью http-сервера. Предупреждение безопасностиЛюбой, кто может писать в каталог, где Apache httpd записывает файл журнала, почти наверняка может получить доступ к uid, под которым запускается сервер, который обычно является root. НЕ давайте людям доступ на запись к каталогу, в котором хранятся журналы, не зная о последствиях ; подробности см. в документе с советами по безопасности. Кроме того, файлы журналов могут содержать информацию, предоставленную клиентом напрямую, без экранирования. Таким образом, злоумышленники могут вставлять управляющие символы в файлы журналов, поэтому необходимо соблюдать осторожность при работе с необработанными журналами. Журнал ошибок
Журнал ошибок сервера, имя и местонахождение которого задаются директивой
Журнал ошибок обычно записывается в файл (обычно
Формат журнала ошибок определяется директивой Первым элементом в записи журнала является дата и время сообщения. Следующим является модуль, создающий сообщение (в данном случае основной) и уровень серьезности этого сообщения. За ним следует идентификатор процесса и, при необходимости, идентификатор потока процесса, в котором возникла ситуация. Далее у нас есть адрес клиента, который сделал запрос. И, наконец, подробное сообщение об ошибке, которое в данном случае указывает на запрос несуществующего файла. В журнале ошибок может появиться очень большое количество различных сообщений. Большинство из них похоже на пример выше. Журнал ошибок также будет содержать результаты отладки сценариев CGI. Любая информация, записанная Помещение Во время тестирования часто бывает полезно постоянно отслеживать журнал ошибок на наличие проблем. В системах Unix вы можете сделать это, используя: Ведение журнала по модулямДиректива Сделайте это, указав имя модуля в своей
Перезапись информации LogLevel: trace5 Это устанавливает для main RewriteLog , которые присутствовали в более ранних версиях сервера.
Журнал доступа
В журнале доступа к серверу записываются все запросы, обработанные сервером. Расположение и содержимое журнала доступа контролируются директивой Конечно, сохранение информации в журнале доступа — это только начало управления журналом. Следующим шагом является анализ этой информации для получения полезной статистики. Анализ журнала в целом выходит за рамки этого документа и не является частью работы самого веб-сервера. Для получения дополнительной информации по этой теме, а также для приложений, выполняющих анализ журналов, посетите Open Directory. Различные версии Apache httpd использовали другие модули и директивы для управления ведением журнала доступа, включая mod_log_referer, mod_log_agent и директиву
Формат журнала доступа легко настраивается. Формат задается с помощью строки формата, которая очень похожа на строку формата printf(1) в стиле C. Некоторые примеры представлены в следующих разделах. Полный список возможного содержимого строки формата см. в разделе Общий формат журналаТипичная конфигурация журнала доступа может выглядеть следующим образом. LogFormat "%h %l %u %t \"%r\" %>s %b" общий Журналы CustomLog/access_log общие Это определяет псевдоним Директива Приведенная выше конфигурация будет записывать записи журнала в формате, известном как Common Log Format (CLF). Этот стандартный формат может создаваться множеством различных веб-серверов и считываться многими программами анализа журналов. Записи файла журнала, созданные в CLF, будут выглядеть примерно так: Каждая часть этой записи журнала описана ниже.
Комбинированный формат журналаДругая часто используемая строка формата называется комбинированным форматом журнала. Его можно использовать следующим образом. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" в сочетании Комбинированный журнал CustomLog/access_log Этот формат точно такой же, как и общий формат журнала, с добавлением еще двух полей. В каждом из дополнительных полей используется процентная директива
, где заголовком может быть любой заголовок HTTP-запроса. Журнал доступа в этом формате будет выглядеть так: Дополнительные поля:
Журналы множественного доступаЖурналы множественного доступа можно создать, просто указав несколько LogFormat "%h %l %u %t \"%r\" %>s %b" общий Журналы CustomLog/access_log общие Журналы CustomLog/referer_log "%{Referer}i -> %U" Журналы CustomLog/agent_log "%{User-agent}i" Этот пример также показывает, что нет необходимости определять псевдоним с помощью директивы Условные журналыБывают случаи, когда удобно исключить определенные записи из журналов доступа на основе характеристик клиентского запроса. Это легко сделать с помощью переменных окружения. Во-первых, необходимо установить переменную среды, чтобы указать, что запрос соответствует определенным условиям. Обычно это достигается с помощью
# Пометить запросы от loop-back интерфейса SetEnvIf Remote_Addr "127\.0\.0\.1" не регистрируйте # Отметить запросы для файла robots.txt SetEnvIf Request_URI "^/robots\.txt$" не регистрируйте # Записываем, что осталось Журналы CustomLog/access_log общий env=!dontlog В качестве другого примера рассмотрим регистрацию запросов от англоговорящих пользователей в один файл журнала, а не говорящих по-английски — в другой файл журнала. SetEnvIf Accept-Language "en" английский Журналы CustomLog/english_log общий env=english Журналы CustomLog/non_english_log общий env=!english В сценарии кэширования хотелось бы знать об эффективности кэша. Очень простой способ выяснить это: SetEnv CACHE_MISS 1 LogFormat "%h %l %u %t "%r" %>s %b %{CACHE_MISS}e" общий кэш Журналы CustomLog/access_log общий кэш В дополнение к LogFormat "%400,501{User-agent}i" журнал браузера LogFormat "%!200,304,302{Referer}i" журнал перехода В первом примере Хотя мы только что показали, что условное ведение журнала является очень мощным и гибким, это не единственный способ управления содержимым журналов. Файлы журналов более полезны, если они содержат полную запись активности сервера. Часто бывает проще просто выполнить постобработку файлов журнала, чтобы удалить запросы, которые вы не хотите рассматривать. Ротация журналаДаже на умеренно загруженном сервере объем информации, хранящейся в файлах журналов, очень велик. Файл журнала доступа обычно увеличивается на 1 МБ или более на каждые 10 000 запросов. Следовательно, необходимо будет периодически менять файлы журналов, перемещая или удаляя существующие журналы. Это невозможно сделать во время работы сервера, потому что Apache httpd будет продолжать запись в старый файл журнала до тех пор, пока он будет держать этот файл открытым. Вместо этого сервер необходимо перезапустить после перемещения или удаления файлов журнала, чтобы он открыл новые файлы журнала. Используя плавный перезапуск, серверу можно дать указание открывать новые файлы журналов без потери каких-либо существующих или ожидающих соединений от клиентов. Однако для этого сервер должен продолжать запись в старые файлы журналов, пока он завершает обслуживание старых запросов. Поэтому необходимо подождать некоторое время после перезапуска, прежде чем выполнять какую-либо обработку файлов журнала. Типичный сценарий, который просто меняет журналы и сжимает старые журналы для экономии места: Еще один способ выполнить ротацию журналов — использовать конвейерные журналы, как описано в следующем разделе. Перенаправленные журналыApache httpd может записывать файлы журналов ошибок и доступа через канал к другому процессу, а не напрямую к файлу. Эта возможность значительно повышает гибкость ведения журнала без добавления кода на главный сервер. Чтобы записывать журналы в канал, просто замените имя файла символом канала " Процессы передаваемого журнала порождаются родительским процессом Apache httpd и наследуют идентификатор пользователя этого процесса. Это означает, что программы ведения журналов обычно запускаются от имени пользователя root. Поэтому очень важно, чтобы программы были простыми и безопасными. Одним из важных способов использования журналов, передаваемых по конвейеру, является возможность чередования журналов без перезапуска сервера. HTTP-сервер Apache включает в себя простую программу, вызываемую CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" общий Обратите внимание, что кавычки заключают в себя всю команду, которая будет вызываться для канала. Хотя эти примеры относятся к журналу доступа, тот же метод можно использовать и для журнала ошибок. Как и в случае условного ведения журналов, конвейерные журналы — очень мощный инструмент, но их не следует использовать там, где доступно более простое решение, такое как автономная постобработка. По умолчанию процесс передаваемого журнала запускается без вызова оболочки. Используйте " # Вызвать «rotatelogs» с помощью оболочки CustomLog "| $/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" общий Это было поведением по умолчанию для Apache 2.2. В зависимости от специфики оболочки это может привести к дополнительному процессу оболочки на время существования программы канала регистрации и проблемам с обработкой сигналов во время перезапуска. Из соображений совместимости с Apache 2.2 обозначение " Примечание для WindowsОбратите внимание, что в Windows вы можете столкнуться с проблемами при запуске многих конвейерных процессов ведения журнала, особенно когда HTTPD работает как служба. Это вызвано нехваткой места в куче рабочего стола. Пространство кучи рабочего стола, предоставляемое каждой службе, указывается третьим аргументом параметра
Виртуальные хостыПри запуске сервера со многими виртуальными хостами существует несколько вариантов работы с файлами журналов. Во-первых, можно использовать логи точно так же, как и на одноузловом сервере. Просто поместив директивы ведения журнала вне Если директивы Для журнала доступа есть очень хороший компромисс. Добавляя информацию о виртуальном хосте в строку формата журнала, можно записывать все хосты в один и тот же журнал, а затем разбивать журнал на отдельные файлы. Например, рассмотрим следующие директивы. LogFormat "%v %l %u %t \"%r\" %>s %b" Журналы CustomLog/access_log Используется Другие файлы журналов
Регистрация фактических отправленных и полученных байтов Криминалистическая регистрация PID-файлПри запуске Apache httpd сохраняет идентификатор родительского процесса httpd в файле Журнал сценариевЧтобы помочь в отладке,
|