Apache остановился? /server-status показывает более 240 запросов, таких как "OPTIONS * HTTP/1.0" 200 - "-" Apache (внутреннее фиктивное соединение)"
Некоторые детали:
- Веб-сервер: Apache/2.2.13 (FreeBSD) mod_ssl/2.2.13 OpenSSL/0.9.8e
- ОС: FreeBSD 7.2-RELEASE
- Это FreeBSD Jail.
- Я полагаю, что я использую Apache 'prefork' MPM (я использую FreeBSD по умолчанию).
- Я использую значения по умолчанию для MaxClients (256)
Я включил mod_status с "ExtendedStatus On". Когда я просматриваю / состояние сервера, я вижу несколько регулярных запросов. Я также вижу более 240 запросов от "localhost", как эти.
37-0 - 0/0/1 . 0.00 1510 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
38-0 - 0/0/1 . 0.00 1509 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
39-0 - 0/0/3 . 0.00 1482 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
40-0 - 0/0/6 . 0.00 1445 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
Я также вижу около 2417 запросов вчера от localhost, например:
Apr 14 11:16:40 192.168.16.127 httpd[431]: www.example.gov 127.0.0.2 - - [15/Apr/2010:11:16:40 -0700] "OPTIONS * HTTP/1.0" 200 - "-" "Apache (internal dummy connection)"
На странице http://wiki.apache.org/httpd/InternalDummyConnection написано: "Эти запросы совершенно нормальны, и вам не нужно беспокоиться о них", но я не уверен.
Почему их более 230? Это активные соединения? Если у меня "MaxClients 256" и более 230 таких подключений, кажется, что мой веб-сервер находится в опасной близости к исчерпанию доступных подключений. Также кажется, что Apache нужно всего лишь несколько таких "внутренних фиктивных соединений"
У нас на самом деле было два необъяснимых сбоя прошлой ночью, и мне интересно, не вызвали ли эти "внутренние фиктивные связи" наши доступные соединения.
ОБНОВЛЕНИЕ 2010/04/16
Это 8 часов спустя. Страница /server-status по-прежнему показывает, что есть 243 строки с надписью "www.example.gov OPTION *". Я считаю, что эти связи не активны. Сервер в основном простаивает (1 запрос в данный момент обрабатывается, 9 незанятых рабочих). На хосте Unix есть только 18 активных процессов httpd.
Если эти соединения не активны, почему они отображаются в /server-status? Я ожидал, что они истекают через несколько минут после инициализации.
5 ответов
Ну, это был неожиданный ответ. Это было вызвано проблемой файловой системы, когда мы делали снимки файловой системы UFS в полночь.
Похоже, это вызвано ошибкой FreeBSD UFS. Мы используем FreeBSD Jails на хосте FreeBSD с файловой системой UFS по умолчанию. Файловая система UFS большая - 1,8 ТБ.
Раз в ночь мы запускаем резервное копирование с помощью команды dump(8). Утилита dump(8) создала моментальный снимок файловой системы перед ее резервным копированием, и это заморозило файловую систему. Дамп должен работать с файловыми системами менее 2 ТБ, но в нашем случае это не удалось. У этого парня была такая же проблема.
(Я переместил свой ответ из раздела вопросов здесь в раздел ответов. Stefan, 20100608)
Apache управляет стадом с грохотом немного иначе, чем вы можете себе представить. Когда вы получаете пакет входящего трафика, он порождает несколько дочерних процессов, если он определяет, что ему нужно больше, он порождает вдвое больше в следующем интервале, пока, наконец, не будет достаточно процессов для обслуживания запросов или попаданий maxclients.
Если вы видите это, это означает, что apache просто проверяет дочерние элементы, и что бы ни вызывало apache для форка, многие процессы, вероятно, пропали. Да, они подключаются к клиентским соединениям, но какое бы событие ни вызывало спулинг, оно, вероятно, прошло.
Первое, что я бы проверил в ваших журналах, это куча 302-х до начала мероприятия.
Если бы у вас было что-то вроде
<?php include("http://www.oursite.com/header.php");?>
где header.php отсутствовал и
ErrorDocument 404 /404.php
где 404.php включает header.php, вы получите рекурсивный цикл, и попадание на эту страницу немедленно заставит apache использовать все доступные соединения.
Я понимаю, что, учитывая, что это связи между родителем и дочерним процессом, они просто Apache, отслеживающий то, что делают дети. Имейте в виду, что:
- после обработки запроса дети могут довольно долго гулять
- внутренние фиктивные соединения происходят регулярно
- если ребенок не сделал ничего другого (потому что сервер в основном простаивает), фиктивное соединение будет самым последним, что он обрабатывает
Насколько я знаю, дело не в том, что фиктивные связи "истощают" детей. Apache проверяет статус своих детей, а не проверяет их, работают они или нет.
Если память служит, это тестовые соединения, генерируемые легкими прокси (такими как Lighttpd), которые находятся перед более тяжелыми серверами, такими как Apache.
Учитывая, что вы находитесь в тюрьме, возможно, хост-сервер передает запросы на (частный) IP-адрес тюрьмы через lighttpd?
Вам нужно выяснить, какие процессы подключены к вашему порту Apache (я предполагаю, что это 80).
У меня нет системы FreeBSD, поэтому я могу подтвердить команды, но по крайней мере на Mac это должно дать вам подсказку:
$ lsof -i
Это покажет что-то вроде:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
BadGuy 26655 yvesj 24u IPv4 0x3f32270 0t0 TCP localhost:56696->localhost:56695 (ESTABLISHED)
GoodGuy 26656 yvesj 15u IPv4 0x5b7666c 0t0 TCP localhost:56695 (LISTEN)
GoodGuy 26656 yvesj 16u IPv4 0x72a9e64 0t0 TCP localhost:56695->localhost:56696 (ESTABLISHED)
Из этого вы можете заметить, что процесс с PID 26656 прослушивает порт 56695, а процесс 26655 подключается к этому порту. Таким образом, вы можете определить, кто является плохим парнем (только не путайте с третьей строкой, которая показывает другую сторону соединения (goodguy=>badguy).
Когда вы примените это к вашему делу, вы обнаружите, какие другие процессы в вашей системе удерживают эти соединения с вашим экземпляром Apache.
Удачи!
Ив