Как лучше всего мониторить хост?

alexb

Новичок
Как лучше всего мониторить хост?

Положим, есть хост www.abc.ru имеющий серверы имён ns1.abc.ru и ns2.abc.ru (на этом сервере могут быть и другие сервисы например фтп) и есть хост xyz.ru.
Стоит задача _постоянно_ (т.е. краткопериодично тестируя) определять с хоста xyz.ru, не случилось ли чего с сервером хоста abc.ru. Навскидку наиважнейшие службы это серверы имён и сам вебсервер. Поэтому думаю что слежение за указанными тремя адресами необходимо и достаточно. Думаю, наилучшая последовательность мониторинга: ns1.abc.ru, ns2.abc.ru, www.abc.ru.
По всей видомости серверы имён требуют пингования для определения работоспособности и доступности. Сам хост www.abc.ru можно проверять на доступность тривиальной ф-цией удалённого чтения fopen(URL)/fread().
Встают некоторые вопросы, которые я не смог разрешить читая руководства. Обращаюсь к Клубу для помощи.
1. каков тайм-аут fopen(URL) если хост не доступен? и можно ли управлять в PHP его значением?
(поясняю: чтобы ф-ция не подвисла при недоступности хоста на много-много секунд/минут);
2. есть ли реализации команды ping в виде PHP-кода? (если да - то где можно взять код?)
(поясняю: стандартная команда ping вызванная из PHP выдаст 5-пинговую последовательность, на мой взгляд это здесь излишне - занимает в 5 раз больше времени на мониторинг одного сервера имён, а их к тому же два).
Это основные вопросы темы. Впрочем возникает попутный вопрос: в случае если тайм-аут fopen(URL) велик и неуправляем, есть ли возможность простой реализации описанной цели на иных простых PHP-функциях (сокеты?). Или может быть проще и лучше _все_три_адреса_ пинговать посредством написанной ф-ции PHP-пинг?
Возможно в процессе обсуждения проблемы откроются аспекты требующие прояснения гуру.
Приглашаю к обсуждению всех хорошо знающих предмет. Заранее благодарен за помощь!
 

AndreyKl

Новичок
Если есть возможность, я бы поставил что-то типа zabbix (http://zabbix.com) . Система мониторинга.
 

alexb

Новичок
Да, мне нужна реализация мониторинга на пхп и отнюдь не стандартная...
Спасибо заранее всем кто сможет помочь именно в этом!

-~{}~ 13.08.06 12:00:

УТОЧНЕНИЕ: способен всё сам реализовать кроме непонятности в топиковых вопросах... :)
 

Кром

Новичок
Пинг можно вызывать через system() и т.д. Параметры пингования указыватся как и в любой программе см. ping -h
 

alexb

Новичок
Gorynych, спасибо за указание на на http://ru.php.net/curl !
К счастью это расширение похоже повсеместно подключено в пхп. Возможно эти фишки дадут мне ответы на мои вопросы в топиковом постинге. Не ясно мне пока - через curl-функции как пинговать нужный хост не по хттп протоколу. Это всё еще требует для меня прояснения. Лишь с установкой таймаута похоже я разобрался.
Другое дело - пинг сервера имён: пока не нашел возможностей исп. curl реализовать его. Или я не прав?
Каков протокол и порт для пингования сервера имён?
Это довольно специфический вопрос и я его как-то упустил в своём образовании до сего времени :)
Спасибо за помощь!

-~{}~ 13.08.06 18:28:

Автор оригинала: Кром
Пинг можно вызывать через system() и т.д. Параметры пингования указыватся как и в любой программе см. ping -h
Крайне не желательно вызваать юникс команды...
 

Gorynych

Посетитель PHP-Клуба
alexb

я вообще считаю, что ping не средство мониторинга. Это отдельный сервис и факт пингования говорит о том, что сервер, к которому вы обращаетесь откликается эхом.

но во-первых это не значит, что поднят и откликается нужный веб-сервер

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

мне упорно кажется, что ответ о доступности веб-ресурса это скорее обращение к нему с запросом типа HEAD

-~{}~ 13.08.06 19:15:

что касается DNS сервера, то скорее вам нужно слать ICMP запрос. Кстати, на http://ru.php.net/fsockopen как раз есть пример PHP-ping'а. Правда с некоторыми ошибками :) В качестве протокола должно быть
Код:
$handle=fsockopen([b]'udp://'[/b].$host, 7, $errno, $errstr, $timeout);
ну и у меня интерпретатор ругается на тамошнюю версию кода для засечки времени:
Код:
//Time the responce
// У меня вызов microtime(true) вызывает Notice
// так что вызываю без параметров см. [url]http://ru.php.net/microtime[/url]
list($usec, $sec) = explode(" ", microtime(true)); 
$start=(float)$usec + (float)$sec;
 

alexb

Новичок
Всё, господа!
кажется я разобрался как пинговать с помощью fsockopen() и как устанавливать таймаут через stream_set_timeout() !!!
Однако сам себе отвечаю (кому-то ещё может быть также понадобится) - порт пингования = 53, протокол - udp.
Всем спасибо!
Если будут конструктивные идеи упрощающие реализацию топиковых задач - буду благодарен за подсказки!

-~{}~ 13.08.06 19:42:

Дорогой Gorynych, Вы написали: "мне упорно кажется, что ответ о доступности веб-ресурса это скорее обращение к нему с запросом типа HEAD" - я с этим полностью согласен! Изначально я же и предполагал юзать fopen(url) для мониторинга вебсервера! Наши мнения совпадают.
Однако как иначе протестить на доступность нэймсервер кроме как не пингованием?
Если есть разумная идея - милости просим на борду :)

-~{}~ 13.08.06 20:09:

Gorynych - "вызов microtime(true) вызывает Notice" - разве microtime() когда-либо вызывалась с параметрами? Это явная ошибка (в описании?). Я всегда юзал просто microtime() и проблем не бывало.
2. ...В качестве протокола должно быть ... udp://'
Это понятно мне стало из примера 2 почти в самом начале страницы http://ru.php.net/fsockopen
А вот function Ping() я лишь сейчас там нашел. Спасибо за указание! :)
 

antson

Новичок
Партнер клуба
alexb
сервер имен наверное лучше проверять посылкой запроса на разрешение нужного Вам имени и проверкой ответа сервера.

просто пингуя 53 порт Вы проверяете доступность днс сервиса на сервере, но не то, что он правильно держит имя.

К сожалению не могу привести номер рфс и форматы пакетов, но думаю Вам в этом напрвлении досточно просто идеи.

собираем пакет. через функции работы с сокетами посылаем и читаем отклик. Пакет проще всего подглядеть любым снифером
 

Gorynych

Посетитель PHP-Клуба
antson
это ICMP протокол, который изначально RFC 792, но искать надо по ICMP (потому как RFC 792 делает вид, что документ потерялся).

alexb
Однако как иначе протестить на доступность нэймсервер кроме как не пингованием?
честно говоря, я бы наверное попробовал открыть внешний процесс nslookup (через http://php.net/proc_open ) и попробовал бы поменять сервер на проверяемый (через server IP-адрес) + спросить у него какую-нибыдь обслуживаю им запись.

но Вы тут писали, что использование команд нежелательно...
 
Сверху