Назад | Перейти на главную страницу

Может ли кто-нибудь сказать мне, является ли это вероятной проблемой apache?

Мне сказали, что наша (по сценарию) ежедневная перезагрузка apache была настроена из-за нашей ротации журналов. Проблема заключается в том, что logrotate может потерять строку в журналах доступа, если он вращается во время работы apache и приема запросов.

Может кто-нибудь сказать мне, правдоподобно ли это, или полная чушь?

Вам необходимо перезапустить сервер после ротации журналов, поскольку Apache удерживает дескриптор файла в журнале и продолжит запись в старый файл журнала, если вы этого не сделаете. Отправка USR1 родительскому элементу (постепенный перезапуск) должна помочь.

Ссылка: 1.3, 2.2

Цитата из 2.2 документов:

Даже на умеренно загруженном сервере количество информации, хранящейся в файлах журнала, очень велико. Файл журнала доступа обычно увеличивается на 1 МБ или более на 10 000 запросов. Следовательно, необходимо будет периодически чередовать файлы журналов, перемещая или удаляя существующие журналы. Это невозможно сделать во время работы сервера, потому что Apache будет продолжать запись в старый файл журнала, пока он остается открытым. Вместо этого необходимо перезапустить сервер после перемещения или удаления файлов журнала, чтобы открывались новые файлы журнала.

Используя плавный перезапуск, сервер может получить указание открывать новые файлы журналов без потери существующих или ожидающих подключений от клиентов. Однако для этого сервер должен продолжать запись в старые файлы журнала, пока он завершает обслуживание старых запросов. Поэтому необходимо подождать некоторое время после перезапуска, прежде чем выполнять какую-либо обработку файлов журнала. Типичный сценарий, который просто вращает журналы и сжимает старые журналы для экономии места:

mv access_log access_log.old
mv error_log error_log.old
apachectl graceful sleep 600
gzip access_log.old error_log.old 

Другой способ выполнить ротацию журналов - использовать конвейерные журналы, как описано в следующем разделе.

Совершенно правдоподобно. Зависит от того, как вы останавливаете Apache.

Если вы выполняете еженощный HUP, чтобы серверы запускали новый журнал, вы должен нет проблем. Любая неуклюжая остановка и перезагрузка, да и ваша собственная!

Однако любые соединения, присутствующие во время ночного HUP, будут потеряны, и этим игрокам придется повторно подключиться. Немного жаль, если они находятся в процессе большой загрузки!

Если вы регистрируете байты, обслуживаемые как часть запроса, соединение не регистрируется до завершения загрузки, поэтому те соединения, которые были прерваны из-за HUP, будут отсутствовать в журналах.

Вы смотрели новую версию 2.2.12?

Одно из изменений состоит в том, чтобы сделать «пропущенные через ротацию журналов» более надежными, чтобы вы могли перенести ротацию на утилиту rotatelogs и позволить ей выполнять верхнюю и нижнюю часть ваших журналов без необходимости выполнять ночной HUP. Таким образом, никаких сброшенных соединений и отсутствующих транзакций журнала, если ваши байты журнала обслуживаются.

Док говорит

Вращение происходит в начале этого интервала. Например, если время ротации равно 3600, файл журнала будет чередоваться в начале каждого часа; если время вращения равно 86400, файл журнала будет обновляться каждую ночь в полночь.

Если вы заглянете внутрь журналов поворота, неясно, как они это делают, поскольку магических чисел вообще нет, пока вы не заметите строку:

tLogStart = (now / tRotation) * tRotation;

При этом время начала совпадает с началом текущего часа (для tRotation == 3600) или предыдущей полуночи (для tRotation == 86400). Кто знает, что он сделает с любыми другими числами, например 16432?

Редактировать: Я забыл сказать, что мы видели проблемы с изящным не очень изящным поведением. В частности, просто оставляя дочерние процессы зависшими. Похоже, это было подтверждено, поскольку v2.2.12 теперь имеет новую конфигурационную директиву GracefulShutdownTimeout, которая указывает тайм-аут, по истечении которого процесс httpd завершается независимо от обслуживаемых запросов.

HTH

'Avahappy,

Почему потеря одной строчки такая большая проблема? Если это так важно, возможно, журналы нужно распечатать на зеленая полоса в качестве резервной копии.

Да, согласно другим ответам, проблема в том, что apache продолжит запись в дескриптор файла, который он открыл.

Мы (и многие другие) используем cronlog чтобы этого не произошло. В этой настройке apache передает журналы в cronolog, и сервер не нужно перезапускать / перезагружать.