アクセス過多などでDBサーバが落ちている場合や、Webサーバが落ちている状態を監視する仕組みがほしいといことなので、簡単にまとめてみました。
リダイレクトがかかっている場合などは考慮してないので、実用ってことだともっとしっかりした方が良いですが、Cronで監視すればとりあえずなんとなく使えたりするかも。
条件
- PHP 5.3.3
- CentOS 6.5
PHPのプログラムソース
file_get_contentsを利用しますがエラーに問題がありそうなので、file_get_contentsでは「@」を利用してエラーを抑制しておきます。
$http_response_headerが存在しない場合は、$statusで0を返してサーバーがダウンしている可能性を疑います。
WordPressなどでMySQLが落ちている場合は500が取得できるので、ここでは0、200、500のステータスがわかれば良いかなーと考えました。
[php] // 通知したいメールアドレス $mail = 'xxx@xx.xx'; // 送信元メールアドレス $from = 'xxx@xx.xx'; $urls = array(); $urls[] = array( 'protocol' => 'https', 'domain' => 'inexio.jp' ); $urls[] = array( 'protocol' => 'https', 'domain' => 'kikai-syuuri.com' ); $urls[] = array( 'protocol' => 'https', 'domain' => 'honeybee.pw' ); function get_http_status( $url ) { $options = array( 'http' => array( 'ignore_errors' => true ), ); $context = stream_context_create( $options ); $response = @file_get_contents( $url, false, $context ); $status = 0; if ( isset( $http_response_header ) ) { preg_match( '/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches ); $status = $matches[1]; } return $status; } foreach ( $urls as $num => $data ) { if ( !isset( $data['protocol'] ) || empty( $data['protocol'] ) ) { $url = 'http://' . $data['domain']; } else { $url = $data['protocol'] . '://' . $data['domain']; } $code = get_http_status( $url ); $title = '[' . $code . '] ' . $data['domain']; $message = '[' . $code . ']'; // もっとステータスコードを分けても良いかな switch ( $code ) { case "200": $title = ''; $message = ''; break; case "0": $message .= ' Server Down'; break; case "500": $message .= ' DB Down'; break; default: $message .= ' Error'; break; } if ( !empty( $title ) ) { $message .= chr(10) . $data['domain'] . chr(10) . date( "Y/m/d H:i:s" ); $to = $mail; $subject = $title; $body = $message; $headers = 'From ' . $from . "\r\n" . 'Reply-To: ' . $from . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail( $to, $subject, $body, $headers ); } } [/php]
Cronで設定
上記のPHPコードを「/var/www/check.php」に設置したので、以下のようにCronを設定します。
とりあえずゆるく毎時5分と35分に監視しておこうという感じです。
パーミッションも変更しておく必要があるかもしれません。
[code] 5,35 * * * * /usr/bin/php /var/www/check.php > /dev/null 2>&1 [/code]
ちなみに「/dev/null 2>&1」はよく間違いやすいから注意が必要だ・・・って言われていますね。
まとめ
これでとりあえず監視することができると思います。
リダイレクトされているサイトなどは上記だと処理できないかと思いますので、もっとしっかりと書く必要があるかと思います。
自分の手の届くサイトの監視が目的なので、それはそれで考えれば良いと思います。