PHPを使いサーバー監視をする方法

WEBサイトを運営する場合、気になるのがサーバーの死活状況です。

サーバーがダウンしてユーザーに迷惑をかけてしまっては一大事です。
ただ、そうかといって、ずっとサーバーの負荷状況を目視で確認するのも非現実的な話です。

そこで、PHPスクリプトを組み、サーバーを監視します。

■ 監視方法の概要は次のようになります。

・ 甲サーバーを監視するため、外部乙サーバーからPHPスクリプトにより死活状況監視
・ 乙サーバーのPHPスクリプトは、CRONの仕組みにより定期的に実行
・ 甲サーバーにおいてエラーが生じていたらメールにて通知

それでは、実際のPHPスクリプトです。

<?php

/**** サーバー設定 ****/

mb_language('ja');
mb_internal_encoding('UTF-8');

/**** サーバー情報初期化 ****/

$server_ip   = '20*.*72.*4.5*';
$server_name = 'example.com';
$page_url    = 'http://example.com/sample_page.html';
$mail_to     = 'your-mail';
$mail_from   = 'your-mail';

/**** チェック開始 ****/

$result = '';

//■ 1.pingチェック
$ping_command = 'ping -c 3 -w 5 '. $server_ip;

if (strstr(`$ping_command`, '100% packet loss')) {

    $result .= '1.pingが停止しています。'."\n";
}

//■ 2.socketチェック
$socket = @fsockopen($server_name, '80', $errno, $errstr, 5);

if ($socket === FALSE) {

    $result .= '2.socketを接続できません。'.$errno.$errstr."\n";
}

//■ 3.webアクセスチェック
if (!$res = @file_get_contents($page_url)) {

    $result .= '3.pageを取得できません。'."\n";
}

/**** メール送信 ****/

//停止していればをメール送信
if ($result != '') {

    $subject = 'エラー!停止しています。('. $server_name .')';
    mb_send_mail($mail_to, $subject, $result, 'From: '. $mail_from);

} else {

    $subject = '正常に稼動してます。('. $server_name .')';
    mb_send_mail($mail_to, $subject, '正常稼動中', 'From: '. $mail_from);
}

それでは、少し補足です。

■ 1では、pingを送信し正常かを確認しています。もし、送信したパケットが100%失われていれば、エラーとします。

通常だとpingは次のようなメッセージを生成します。

PING 20*.*72.*6.*0 (20*.*72.*6.*0) 56(84) bytes of data. 
64 bytes from 20*.*72.*6.*0: icmp_seq=1 ttl=64 time=2.71 ms 
64 bytes from 20*.*72.*6.*0: icmp_seq=2 ttl=64 time=0.146 ms 
64 bytes from 20*.*72.*6.*0: icmp_seq=3 ttl=64 time=0.143 ms
 --- 20*.*72.*6.*0 ping statistics --- 
3 packets transmitted, 3 received, 0% packet loss, 
time 2002ms rtt min/avg/max/mdev = 0.143/1.000/2.713/1.211 ms

つまり、‘ping -c 3 -w 5 ‘ のコマンドを実行すると、-cオプションの回数だけ、-wオプションの秒数を限度にパケットを送信するのですが、そのパケットのロスの割合を出力します。このロスの割合が、100%ならば、エラーと判断するわけです。

なお、pingのコマンドは、バッククオート`コマンド`で実行しています。(@マークのキーで出る記号です。)

■ 2では、サーバーにソケット接続して、正常に接続できるかを判断しています。

@fsockopen($server_name, ’80’, $errno, $errstr, 5);の部分ですが、これは、指定したサーバーの80ポート(httpポート)にソケット接続するための関数を実行しています。

引数に、$errno, $errstr などといきなり変数が出てきていますが、この変数に結果が参照で入るのでこのように指定しておきます。なお、5とあるのは、5秒を限度に接続を試みるというものです。

ちなみに、先頭の@マークは、スクリプトエラーが生じた場合に、エラーメッセージを表示させないための記号です。

■ 3では、@file_get_contents($page_url)を実行しています。@マークは上と同様です。

file_get_contentsで正常にファイルを取得できると、その結果を返しますが、失敗するとFALSEを返します。ここで、データベースを使用しているページを指定すると、データベースがきちんと動いているかも推定できます。

最後は、エラー結果に基づき、場合分けしてメールを送信しています。エラーの処理だけ欲しい場合には、else以降は不要となります。

以上です。

(参考)
http://blog.asial.co.jp/486
http://www.seeds-std.co.jp/seedsblog/315.html
http://www.okushin.co.jp/kodanuki_note/2012/09/php-2.html

感謝です。

カテゴリー: PHP パーマリンク

コメントを残す

メールアドレスが公開されることはありません。