«

»

Feb 13

How to: Create a php file to check on the status of a Drupal Server

How to: Create a php file to check on the status of a Drupal Server

I was working on creating a php status file that would indicate if a server was able to handle client requests or not. The idea is that you can have a loadbalancer check periodically those status.php files to see if that server is online and able to handle traffic or not. In my case I was interested in creating a file for a WordPress which one day I hope I’ll get to it, but while looking around for something I found a good one for Drupal.

If you are looking into deploying a Highly Available Drupal server here is the source post that covers how to do so using Varnish as front end proxy servers: http://www.lullabot.com/blog/article/configuring-varnish-high-availability-multiple-web-servers.

I think there is lots of great content on the site but seeing that I already use NginX as a front end proxy server (I once used Varnish but then I figured why add another system to the stack and decided to stay with NginX as I was already using it as our web server) what I was really interested on was the status file. Below I am copying that file for anyone who is interested and you can refer to the original site for more information on how to setup a Highly Available Website.

<?php
// Register our shutdown function so that no other shutdown functions run before this one.
// This shutdown function calls exit(), immediately short-circuiting any other shutdown functions,
// such as those registered by the devel.module for statistics.
register_shutdown_function('status_shutdown');
function status_shutdown() {
  exit();
}

// Drupal bootstrap.
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

// Build up our list of errors.
$errors = array();

// Check that the main database is active.
$result = db_query('SELECT * FROM {users} WHERE uid = 1');
$account = db_fetch_object($result);
if (!$account->uid == 1) {
  $errors[] = 'Master database not responding.';
}

// Check that the slave database is active.
if (function_exists('db_query_slave')) {
  $result = db_query_slave('SELECT * FROM {users} WHERE uid = 1');
  $account = db_fetch_object($result);
  if (!$account->uid == 1) {
    $errors[] = 'Slave database not responding.';
  }
}

// Check that all memcache instances are running on this server.
if (isset($conf['cache_inc'])) {
  foreach ($conf['memcache_servers'] as $address => $bin) {
    list($ip, $port) = explode(':', $address);
    if (!memcache_connect($ip, $port)) {
      $errors[] = 'Memcache bin <em>' . $bin . '</em> at address ' . $address . ' is not available.';
    }
  }
}

// Check that the files directory is operating properly.
if ($test = tempnam(variable_get('file_directory_path', conf_path() .'/files'), 'status_check_')) {
  // Uncomment to check if files are saved in the correct server directory.
  //if (!strpos($test, '/mnt/nfs') === 0) {
  //  $errors[] = 'Files are not being saved in the NFS mount under /mnt/nfs.';
  //}
  if (!unlink($test)) {
    $errors[] = 'Could not delete newly create files in the files directory.';
  }
}
else {
  $errors[] = 'Could not create temporary file in the files directory.';
}

// Print all errors.
if ($errors) {
  $errors[] = 'Errors on this server will cause it to be removed from the load balancer.';
  header('HTTP/1.1 500 Internal Server Error');
  print implode("<br />\n", $errors);
}
else {
  // Split up this message, to prevent the remote chance of monitoring software
  // reading the source code if mod_php fails and then matching the string.
  print 'CONGRATULATIONS' . ' 200';
}

// Exit immediately, note the shutdown function registered at the top of the file.
exit();
Enhanced by Zemanta

Leave a Reply

%d bloggers like this: