web-dev-qa-db-fra.com

script init sous surveillance pour Apache?

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.

16
Ben Williams

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.

  • J'ai essayé de retirer -D NO_DETACH, conjointement avec:
 s'attendre à fork 
 s'attendre à un démon 

Cela n'a pas permis de démarrer le service.

  • J'ai essayé d'utiliser une méthode similaire à /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

10
Ben Williams

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
5
tmueko

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

3
Roman Buczynski

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

2
8128

J'utiliserais une approche très semblable à de Ben Williams mais avec -D FOREGROUND au lieu de -D NO_DETACH.

0
isoma

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.

0
ΤΖΩΤΖΙΟΥ