Script keep-alive Apache2 en PHP

Bonjour à tous,

Apache 2, et notamment lors de l'utilisation de modules complémentaires,
peut être capricieux et planter de façon un peu mystérieuse... Afin de
surveiller que votre serveur web répond correctement, je vous propose
ici un petit script PHP qui vous redémarrera Apache automatiquement et
vous alertera par e-mail si ce dernier est tombé.



#!/usr/bin/php
<?
ini_set('display_errors', 'on' );
error_reporting(E_ALL);

/**
 * Configuration du programme
 */

// URL a tester
$c_url         = 'http://localhost/';
// Destinataire des alertes
$c_email_to     = 'vous@domain.tld';
// Expéditeur
$c_email_from   = 'vous@domain.tld';
// Fichier temporaire
$c_tmpfile    = '/tmp/.apache-was-up';
// SMTP
$c_smtp        = 'smtp.fai.tld';

$c = curl_init();
curl_setopt( $c, CURLOPT_URL,             $c_url );
curl_setopt( $c, CURLOPT_RETURNTRANSFER,     1 );
curl_setopt( $c, CURLOPT_CONNECTTIMEOUT,     1 );
curl_setopt( $c, CURLOPT_HEADER,         1 );

$data = curl_exec( $c );

if( preg_match( '|HTTP/1.1 [0-9]+|', $data ) )
{
    echo 'Apache is UP :-)'.PHP_EOL;
    file_put_contents( $c_tmpfile, time() );
}
else
{
    echo 'Apache seems to be DOWN :-('.PHP_EOL;
    if( true === file_exists( $c_tmpfile ) ) // Spamming is bad !
    {
        $body = 'Event date : '.date('c').PHP_EOL.PHP_EOL;

        $body .= ' * Apache access log :'.PHP_EOL;
        $body .= `tail -n 30 /var/log/apache2/access.log`;
        $body .= PHP_EOL;

        $body .= ' * Apache error log :'.PHP_EOL;
                $body .= `tail -n 100 /var/log/apache2/error.log`;
        $body .= PHP_EOL;

        // Kicking apache processes
        $body .= `/etc/init.d/apache2 stop`;
        //$body .= `killall -9 apache2`;

        // Starting apache
        $body .= `/etc/init.d/apache2 start`;
       
        // Send alert mail
        $headers = array (
            'From'         => $c_email_from,
               'To'         => $c_email_to,
               'Subject'     => 'Apache was down and has been restarted !'
        );

        require_once 'Mail.php';
        $smtp = Mail::factory('smtp', array ('host' => $c_smtp));
       
        $mail = $smtp->send( $c_email_to, $headers, $body);
        echo 'Alert e-mail sent.'.PHP_EOL;

        @unlink( $c_tmpfile );
    }

}

Notez que ce script utilise les paquets PEAR:Mail et PEAR:Net_SMTP. Pour les installer, exécutez les commandes suivantes :

pear install Mail
pear install Net_SMTP

Il ne reste plus qu'à ajouter une ligne dans votre crontab (crontab -e) et le
redémarrer !

* * * * * /usr/local/sbin/apache-keep-alive > /dev/null 2>&1

N'hésitez pas à me solliciter pour de plus amples informations !!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.