inexio(アイネクシオ)

私たちはネットワークから新しいアイデアを創出します

サーバーの状態を監視してみる

   

アクセス過多などで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のステータスがわかれば良いかなーと考えました。

// 通知したいメールアドレス
$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 );
	}
}

Cronで設定

上記のPHPコードを「/var/www/check.php」に設置したので、以下のようにCronを設定します。
とりあえずゆるく毎時5分と35分に監視しておこうという感じです。
パーミッションも変更しておく必要があるかもしれません。

5,35 * * * * /usr/bin/php /var/www/check.php > /dev/null 2>&1

ちなみに「/dev/null 2>&1」はよく間違いやすいから注意が必要だ・・・って言われていますね。

まとめ

これでとりあえず監視することができると思います。
リダイレクトされているサイトなどは上記だと処理できないかと思いますので、もっとしっかりと書く必要があるかと思います。
まぁ、自分の手の届くサイトの監視が目的なので、それはそれで考えれば良いと思います。

 - CentOS, PHP, サイト改善 ,