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
感謝です。