アイネクシオWebサイトドクター

WebサイトやWebシステムの悩みを解決します

スキル

  • PHP
  • Python
  • C#
  • Java
  • Swift
  • Dart
  • HTML(CSS
  • Javascript
  • MySQL
  • PostgreSQL
  • Sqlite
  • Access
  • Redhat系 Linux
  • Debian系 Linux
  • CodeIgniter
  • fuelPHP
  • CakePHP
  • flutter
  • CLIP STUDIO PAINT

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

2019/07/15 2015/11/17

Category:CentOS, PHP, サイト改善 Tag:,

アクセス過多などで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」はよく間違いやすいから注意が必要だ・・・って言われていますね。

まとめ

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

自分の手の届くサイトの監視が目的なので、それはそれで考えれば良いと思います。

アバター画像
プログラマーとして存在しています。 コーヒーとヌーノ・ベッテンコート、リッチーコッツェンが大好き。ボクシングも大好き。家族も音楽も好き。仕事もそれなりに好き。仕事ください。

https://lit.link/grooveline

執筆者:TAKAHIRO