Checker la syntaxe automatiquement avant un restart 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 :


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
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é.
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
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.