Je veux utiliser Apache sur Ubuntu 10.04 et utiliser les outils de supervision Nice dans les versions récentes (je ne parle pas seulement du script init Apache, mais de la supervision de service appropriée à la daemontools - c’est-à-dire le redémarrage d’Apache quand il meurt, comme ça).
Quelqu'un a-t-il une configuration qui permet de superviser Apache avec Ubuntu 10.04?
Les googles ne m'ont pas aidé, mais il se peut que mon google-fu soit faible.
Woooo!
J'ai écrit ma propre version qui fonctionne plutôt bien - avec quelques piratages de fichiers de configuration et l'utilisation de -D NO_DETACH
.
Tout d'abord, je devais définir User
, Group
et PidFile
dans /etc/Apache2/Apache2.conf
manuellement, plutôt que de les faire venir de /etc/Apache2/envvars
. Je ne pouvais pas trouver un moyen d’exporter correctement ces vars (j’ai essayé à la fois env
et export
comme 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, ceci est 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 Apache2
et obtenir des résultats significatifs; Si je kill -9
le processus Apache principal, il est ré-créé presque immédiatement, puis il démarre et s’arrête au démarrage comme prévu. Donc, ça marche assez bien, je pense.
J'ai essayé des choses que je ne pouvais pas faire fonctionner.
-D NO_DETACH
, conjointement avec:s'attendre à fork s'attendre à un démon
Cela n'a pas permis de démarrer le service.
/etc/Apache2/envvars
pour renseigner les variables ${Apache_*}
:export 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 à propos de Apache2: bad user name ${Apache_RUN_USER}
.
Essayé la sortie de la console et les options par défaut de la console; à ce stade, je me battais vraiment pour essayer d'obtenir des messages d'erreur significatifs. Semblait ne faire aucune différence.
console output
Cela était utile pour le débogage des messages Apache:
exec /usr/sbin/Apache2 -X -e debug -E /var/log/Apache2/foo.log
Voici une autre tentative de ne pas modifier /etc/Apache2/Apache2.conf
qui 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
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
J'ai aussi touché ce problème, mais j'ai utilisé une autre approche. Le moyen le plus simple d'obtenir les variables env consiste à utiliser la commande source et à la pointer vers le fichier envvars Apache. Vous pouvez ensuite 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 dirigez le superviseur vers son emplacement. Vous devez également utiliser le signal d’arrêt.
command=/etc/Apache2/Apache2_foreground.sh
stopsignal=6
Les deux premières lignes du script identifient 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 quoi je n'aurais pas pu faire en sorte que superviseur tue les processus Apache2
Le signal d’arrêt 6 est utilisé car je ne pouvais trouver aucun autre signal pouvant invoquer le piège, le 9 ne pouvait pas être attrapé, et les 2 et 3 ne faisaient rien (le script n’est pas tué).
après cela, il devrait fonctionner sans heurts, sans aucune modification de la configuration d'Apache2
Quelques articles de Scott James Remnant sur le sujet qui, je l’espère, peuvent vous aider:
J'utiliserais une approche très semblable à de Ben Williams mais avec -D FOREGROUND
au lieu de -D NO_DETACH
.
Oh, oui, la réponse sera généralement "écris toi-même", donc ma suggestion en conséquence serait de consulter la page Getting Started - upstart et… de taper.
J'espère que quelqu'un de plus au courant de la question que moi propose un script qui fonctionne bien.