Skip to content

Checker la syntaxe automatiquement avant un restart du serveur web

par billux le 12 juin 2010
Verification de la configuration du serveur web

Une petite astuce qui simplifie beaucoup la vie :)

Quoi de plus énervant que de redémarrer son serveur web après avoir tweaker sa config et de se faire jeter à causse d’une erreur de syntaxe. Surtout que pendant que vous corriger l’erreur dans le fichier, votre serveur web est down ; un temps de disponibilité bêtement perdu.

Alors heureusement, il existe avec la plupart des serveurs web une commande pour vérifier la syntaxe de la conf (lighttpd -t -f config_file sous Lighttpd et apache2ctl configtest sous Apache2). Mais il faut penser à l’exécuter avant chaque redémarrage, ce qui peut devenir très lourd, c’est pourquoi j’ai eu l’idée de l’intégrer dans le script d’init de Lighttpd. Avant chaque restart ou reload du serveur, il fera un test de la configuration et ne redémarrera que si elle est correcte.

Voici à quoi ressemble le nouveau script d’init de lighttpd sous Debian (uniquement les cas reload et restart) :

    reload)
        log_daemon_msg "Checking $DESC configuration file"
        if $DAEMON -t $DAEMON_OPTS
        then
            log_daemon_msg "Reloading $DESC configuration" $NAME
            if start-stop-daemon --stop --signal 2 --oknodo --retry 30 --oknodo \
                --quiet --pidfile $PIDFILE --exec $DAEMON
            then
                if start-stop-daemon --start --quiet  \
                    --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS ; then
                    log_end_msg 0
                else
                    log_end_msg 1
                fi  
            else
                log_end_msg 1
            fi  
        fi  
        ;;  
    restart|force-reload)
        log_daemon_msg "Checking $DESC configuration file"
        if $DAEMON -t $DAEMON_OPTS
        then
            $0 stop
            test -r  $PIDFILE && while pidof lighttpd | \ 
            grep -q `cat $PIDFILE 2>/dev/null` 2>/dev/null ; do sleep 1; done
            $0 start
        fi  
        ;;  
    *)  
        echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        exit 1
        ;;

Ou voici le patch (sans l’adaptation de l’indentation pour plus de lisibilité) si vous préférez :

--- lighttpd.old	2010-06-11 23:42:57.000000000 +0200
+++ /etc/init.d/lighttpd	2010-06-11 23:21:18.000000000 +0200
@@ -54,6 +54,9 @@
         fi
         ;;
     reload)
+		log_daemon_msg "Checking $DESC configuration file"
+		if $DAEMON -t $DAEMON_OPTS
+		then
 		log_daemon_msg "Reloading $DESC configuration" $NAME
 		if start-stop-daemon --stop --signal 2 --oknodo --retry 30 --oknodo \
 			--quiet --pidfile $PIDFILE --exec $DAEMON
@@ -67,12 +70,17 @@
 		else
 			log_end_msg 1
 		fi
+		fi
         ;;
     restart|force-reload)
+		log_daemon_msg "Checking $DESC configuration file"
+		if $DAEMON -t $DAEMON_OPTS
+		then
 		$0 stop
 		test -r  $PIDFILE && while pidof lighttpd | \
 		grep -q `cat $PIDFILE 2>/dev/null` 2>/dev/null ; do sleep 1; done
 		$0 start
+		fi
         ;;
     *)
         echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2

Sur le même sujet :

  1. Page de status de php-fpm et Lighttpd
4 Commentaires
  1. Brice Capelle, le 10 septembre 2010 à 15 h 09 min (permalien)

    Ce problème ne se pose que si tu fais un Stop car si tu fais reload le service n’est pas Down. Seul le vhost avec des erreurs ne fonctionnera pas.

    Par contre il est clair que c’est très pratique comme astuce :)

  2. billux, le 10 septembre 2010 à 19 h 38 min (permalien)

    En fait même pas : lorsque je faisais un reload, avec une erreur de syntaxe dans la conf, il se vautrait lamentablement, comme si il essayais d’appliquer quand même la mauvaise config.
    Je n’ai pas de serveur Apache de test sous la main pour voir si il se passe la même chose avec lui par curiosité.

  3. Brice Capelle, le 11 septembre 2010 à 16 h 20 min (permalien)

    Dans ce cas il est possible qu’il bloque si on touche au système de base mais pas les Vhosts.

    Ce dont je parle m’est arrivé uniquement lorsque je touchais des Vhosts (en fichier séparés de la conf apache). Peut être cela joue t’il. @ tester ;)

  4. billux, le 11 septembre 2010 à 22 h 25 min (permalien)

    Ce que tu me dis là m’étonne ; tous les fichiers de conf d’Apache (apache.conf, port.conf, sites-enabled/*, etc…) sont regroupé d’abord en un seul fichier de conf, puis c’est cette conf qui est injecté dans Apache (si tu regarde le apache.conf, vers le bas, tu verras des « Include » sur les autres fichiers de conf).

    À mon avis ton erreur ne devait pas être trop « critique » au point d’empêcher Apache de démarrer.

Poster une réponse

NB : Le XHTML est autorisé. Votre adresse email ne sera jamais publiée ou partagée.

S'abonner au flux RSS des commentaires