script d'init supervisé par upstart pour Apache?

16

Je veux exécuter apache sur Ubuntu 10.04, et utiliser les trucs sympas de supervision dans upstart (je ne parle pas seulement du script d'initialisation apache, mais d'une supervision de service appropriée à la daemontools - c'est-à-dire, redémarrer apache quand il meurt, des choses comme ça).

Quelqu'un a-t-il une configuration en cours d'exécution pour superviser Apache sur Ubuntu 10.04?

Les googles ne m'ont pas aidé, mais il se peut que mon google-fu soit faible.

Ben Williams
la source
2
J'aimerais aussi en savoir plus. J'héberge beaucoup de choses (principalement des processus Django) et j'aimerais vider mes fragiles scripts d'init pour quelque chose d'un peu plus robuste. N'avait pas envisagé l'arrivée mais si ça marche ...
Oli
1
Je dois dire que ma méthode de supervision normale consiste à utiliser daemontools. Je suis un peu surpris que dans le nouveau monde upstart-ubuntu, personne n'ait utilisé la supervision des services upstart, pour autant que je sache dans mon googler. Je m'attendais à ce que ce soit un problème résolu.
Ben Williams

Réponses:

10

Woooo!

J'ai écrit ma propre version qui fonctionne à peu près - avec un piratage de fichiers conf et une utilisation -D NO_DETACH.

Tout d' abord, je dû mettre User, Groupet PidFileà la /etc/apache2/apache2.confmain, plutôt que de les venir à partir /etc/apache2/envvars. Je n'ai pas pu trouver un moyen d'exporter correctement ces vars (j'ai essayé les deux envet exportselon http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , mais pas bon).

root@lucid:/etc/apache2# diff -u apache2.conf.orig apache2.conf
--- apache2.conf.orig   2010-09-20 13:46:33.857868534 +0930
+++ apache2.conf        2010-09-20 13:47:22.377842204 +0930
@@ -63,7 +63,7 @@
 # identification number when it starts.
 # This needs to be set in /etc/apache2/envvars
 #
-PidFile ${APACHE_PID_FILE}
+PidFile /var/run/apache2.pid

 #
 # Timeout: The number of seconds before receives and sends time out.
@@ -142,8 +142,8 @@
 </IfModule>

 # These need to be set in /etc/apache2/envvars
-User ${APACHE_RUN_USER}
-Group ${APACHE_RUN_GROUP}
+User www-data
+Group www-data

 #
 # AccessFileName: The name of the file to look for in each directory

Ensuite, voici mon travail /etc/init/apache2.conf:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

Je peux faire start|stop|status|reload apache2et obtenir des résultats significatifs; si je suis kill -9le processus maître apache, il est réapparu à peu près immédiatement, et il démarre et s'arrête au démarrage comme prévu. Donc ça marche assez bien, je pense.


Il y a des choses que j'ai essayées et que je n'ai pas pu obtenir.

  • J'ai essayé de supprimer -D NO_DETACH, conjointement avec:
attendre une fourchette
attendre le démon

Cela n'a pas pu démarrer le service.

  • J'ai essayé d'utiliser une méthode similaire /etc/apache2/envvarspour remplir les ${APACHE_*}variables:
exporter APACHE_RUN_USER = www-data
export APACHE_RUN_GROUP = www-data
export APACHE_PID_FILE = / var / run / apache2.pid

Cela n'a pas pu démarrer et a généré une erreur apache2: bad user name ${APACHE_RUN_USER}.

  • Sortie de console éprouvée et options par défaut de la console; à ce stade, j'étais vraiment en train d'essayer d'obtenir des messages d'erreur significatifs. Semblait ne faire aucune différence.

    console output

  • Cela a été utile pour déboguer les messages Apache:

    exec /usr/sbin/apache2 -X -e debug -E /var/log/apache2/foo.log

  • C'était une autre tentative de ne pas modifier /etc/apache2/apache2.confqui a échoué:

    exec APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_PID_FILE=/var/run/apache2.pid /usr/sbin/apache2 -D NO_DETACH -e debug -E /var/log/apache2/foo.log

Ben Williams
la source
Une chose à surveiller .. 'start on runlevel [2345]' peut démarrer avant que les interfaces réseau ne soient configurées .. donc eth0 peut être "up" mais il peut ne pas être prêt à l'emploi. De même, vous ne pouvez avoir aucun système de fichiers local. Un standard qui a été utilisé à la place est start on (systèmes de fichiers locaux et IFACE net-device-up! = Lo).
SpamapS
intéressant! La machine en question n'a pas été redémarrée depuis un moment, je serais donc intéressé à faire un test. Merci pour le conseil.
Ben Williams
1
Salut, grande question, encore meilleure réponse :) Vous pouvez faire fonctionner les envvars comme suit: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH script de fin
Martin Carpenter
5

Eh bien, ce script a fonctionné pour moi:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

limit cpu 300 300
env APACHE_RUN_USER=www-data
env APACHE_RUN_GROUP=www-data
env APACHE_PID_FILE=/var/run/apache2.pid

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn
tmueko
la source
3

J'ai également rencontré ce problème, mais j'ai utilisé une autre approche. La façon la plus simple d'obtenir les variables env est d'utiliser la commande source et de la pointer vers le fichier envvars apache, puis vous pouvez exécuter apache avec les options -D FOREGROUND

Donc, fondamentalement, vous avez besoin d'un script qui ressemble à ceci (le mien est dans /etc/apache2/apache2_foreground.sh):

#!/bin/bash

read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap "kill -TERM -$pgrp; exit" EXIT TERM KILL SIGKILL SIGTERM SIGQUIT


source /etc/httpd/envvars
apache2 -D FOREGROUND

Ensuite, vous le rendez exécutable et pointez le superviseur vers son emplacement, vous devez également utiliser le signal d'arrêt 6

command=/etc/apache2/apache2_foreground.sh
stopsignal=6

Les deux premières lignes du script interceptent l'ID de groupe de processus du script et définissent une interruption qui s'exécute sur les signaux transmis au processus - cette interruption exécute un kill avec un ID de processus négatif du parent qui exécute tous les processus apache2 (le script lui-même) - tuer avec un PID négatif signifie également tuer tous les enfants d'un tel processus (donc dans ce cas tous les processus apache2), sans cela je ne pouvais pas faire superviser par le superviseur les processus apache2

Le signal d'arrêt 6 est utilisé car je n'ai pas pu trouver d'autre signal qui pourrait invoquer le piège, le 9 ne peut pas être attrapé et 2 et 3 ne font rien (le script n'est pas tué)

après cela, il devrait fonctionner correctement, sans aucune modification de la configuration d'apache2.

Roman Buczynski
la source
2

Quelques articles de Scott James Remnant sur le sujet qui, je l'espère, peuvent vous aider:

8128
la source
OK, donc ils entrent dans une partie de l'histoire des démons superviseurs parvenus et certains des détails sanglants. Ce n'est toujours pas un script pour apache supervisé par upstart, et, il y a plus de détails dans la documentation upstart. Je soupçonne que la réponse finale à cela sera "écrivez-la vous-même".
Ben Williams
0

Oh, oui, en général, la réponse sera «écrivez la vôtre», donc ma suggestion typique serait de consulter la page Mise en route - upstart et… de taper.

J'espère que quelqu'un de mieux informé sur la question que moi trouvera un script de démarrage efficace.

ΤΖΩΤΖΙΟΥ
la source
0

J'utiliserais une approche similaire à celle de Ben Williams mais avec -D FOREGROUNDau lieu de -D NO_DETACH.

isoma
la source