Иметь запросы журнала Apache, когда они приходят, а не когда они заканчивают

9

Я пытаюсь диагностировать причудливую проблему сбоев сервера ( сервер отвечает на эхо-запросы, но не принимает соединения SSH до перезагрузки. 0% ЦП ), где перезагрузка сервера возвращает все в нормальное состояние. Я хотел бы, чтобы мои журналы доступа Apache (или некоторые другие журналы) включали все запросы, которые были сделаны правильно, когда произошел сбой, но, к сожалению, Apache не регистрирует запросы до тех пор, пока они не завершатся. Это означает, что если запрос приводит к сбою сервера, этот запрос никогда не завершается и, следовательно, не отображается в журналах.

Есть ли способ настроить Apache для создания файла журнала, в который записываются по мере поступления запросов?

Бен Дилтс
источник
Взгляните также на свою конфигурацию DNS: сломанный или зависший DNS-сервер может вызвать всевозможные проблемы с SSH и не может войти в систему. [Кто знает, что он может сделать для apache - убедитесь, что поиск по имени хоста отключен.]
Шон Кимбалл,

Ответы:

15

Я думаю, что вам нужно судебно-медицинской регистрации, см. Эту ссылку: http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

фрагмент кода:

Формат журнала судебной экспертизы:

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

Для идентификации каждого запроса присваивается уникальный идентификатор запроса. Этот криминалистический идентификатор может быть зарегистрирован в журнале обычной передачи с использованием строки формата% {forensic-id} n. Если вы используете mod_unique_id, будет использоваться его сгенерированный идентификатор.

Первая строка записывает криминалистический идентификатор, строку запроса и все полученные заголовки, разделенные символами канала (|). Пример строки выглядит следующим образом (все на одной строке):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Хост: localhost% 3a8080 | Пользователь-агент: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1.6) Gecko / 20040216 Firefox / 0.8 | Принять: image / png и т. Д.

Символ «плюс» в начале означает, что это первая строка журнала этого запроса. Вторая строка просто содержит символ минус и идентификатор снова:

-yQtJf8CoAB4AAFNXBIEAAAAA

Сценарий check_forensic принимает в качестве аргумента имя файла журнала. Он ищет эти пары +/- ID и жалуется, если запрос не был выполнен.

sandroid
источник
Это то, что я искал, но не похоже, что я могу просто периодически стирать этот журнал (rm /var/log/apache2/forensic.log каждый час), или криминалистическое ведение журнала просто прерывается, пока я не перезапущу apache. Идеи?
Бен Дилтс
конечно, если у вас есть какие-либо журналы Apache, это произойдет. Попробуйте использовать logrotate или любой другой эквивалент в вашей среде, чтобы периодически просматривать журналы (по времени или по размеру). Если нет, вместо удаления попробуйте переместить файл, а затем коснитесь /var/log/apache2/forensic.log (хотя проверьте права доступа)
sandroid
2

Ответ Sandroid подходит для вашего вопроса, но вы также должны рассмотреть возможность захвата сетевых пакетов. Если у вас есть ресурсы, зеркалирование порта внутри коммутатора и использование второй машины с WireShark для записи всего IP-трафика может действительно помочь. Если что-то выводит сервер в точку, где не-HTTP-сервисы не отвечают, то это может быть удаление стека IP, прежде чем плохие данные попадут в Apache.

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

отметка
источник