Startup-überwachtes Init-Skript für Apache?

16

Ich möchte Apache unter Ubuntu 10.04 ausführen und das nette Supervision-Zeug in Upstart verwenden (ich spreche nicht nur über das Apache-Init-Skript, sondern über die ordnungsgemäße Service-Supervision a la Daemontools - das heißt, Apache neu starten, wenn es abstirbt, Dinge so wie das).

Hat jemand eine laufende Upstart-Konfiguration für die Überwachung von Apache auf Ubuntu 10.04?

Die Googles haben mir nicht geholfen, aber es könnte sein, dass mein google-fu schwach ist.

Ben Williams
quelle
2
Das würde ich auch gerne wissen. Ich hoste viele Dinge (hauptsächlich Django-Prozesse) und möchte meine fragilen Init-Skripte für etwas Robusteres ausgeben. Ich hatte nicht überlegt, ob
Oli
1
Ich sollte sagen, meine normale Überwachungsmethode ist die Verwendung von Daemontools. Ich bin ein wenig überrascht, dass in der neuen Welt von Emporkömmlingen und Ubuntu niemand die Serviceüberwachung von Emporkömmlingen in Anspruch genommen hat, soweit ich das bei meinem Googeln beurteilen konnte. Ich hatte erwartet, dass es ein gelöstes Problem sein würde.
Ben Williams

Antworten:

10

Woooo!

Ich habe meine eigene Version geschrieben, die ziemlich gut funktioniert - mit einigem Hacken und Verwenden von conf-Dateien -D NO_DETACH.

Als erstes musste ich Satz User, Groupund PidFilein /etc/apache2/apache2.confmanuell, statt sie kommen aus /etc/apache2/envvars. Ich konnte keine Möglichkeit finden, diese Vars ordnungsgemäß zu exportieren (ich habe beides versucht envund es exportgemäß http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html versucht , aber nichts Gutes).

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

Dann ist das meine Arbeit /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

Ich kann start|stop|status|reload apache2bedeutungsvolle Ergebnisse erzielen; Wenn ich kill -9den Master-Apache-Prozess durchführe, wird er ziemlich sofort neu erzeugt und startet und stoppt beim Booten wie erwartet. Es funktioniert also ziemlich gut, denke ich.


Es gab Dinge, die ich versucht habe und die ich nicht zum Arbeiten bringen konnte.

  • Versucht zu entfernen -D NO_DETACH, in Verbindung mit:
Gabel erwarten
Erwarten Sie Daemon

Der Dienst konnte nicht gestartet werden.

  • Es wurde versucht, eine ähnliche Methode /etc/apache2/envvarszum Auffüllen der ${APACHE_*}Variablen zu verwenden:
exportiere APACHE_RUN_USER = www-Daten
exportiere APACHE_RUN_GROUP = www-Daten
Exportieren Sie APACHE_PID_FILE = / var / run / apache2.pid

Das konnte nicht gestartet werden und verursachte einen Fehler apache2: bad user name ${APACHE_RUN_USER}.

  • Versuchte Konsolenausgabe und Konsolenstandardoptionen; Zu diesem Zeitpunkt habe ich wirklich nur versucht, aussagekräftige Fehlermeldungen zu erhalten. Es schien keinen Unterschied zu machen.

    console output

  • Dies war nützlich zum Debuggen von Apache-Nachrichten:

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

  • Dies war ein weiterer Versuch, dies nicht zu ändern /etc/apache2/apache2.conf:

    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
quelle
Eine Sache, auf die Sie achten sollten: 'start on runlevel [2345]' wird möglicherweise gestartet, bevor die Netzwerkschnittstellen konfiguriert wurden. Ebenso haben Sie möglicherweise keine lokalen Dateisysteme. Ein Standard, der stattdessen verwendet wurde, ist start on (local-filesystems und net-device-up IFACE! = Lo).
SpamapS
interessant! Die betreffende Maschine wurde eine Weile nicht neu gestartet, daher wäre ich an einem Test interessiert. Danke für den Tipp.
Ben Williams
1
Hallo, tolle Frage, noch bessere Antwort :) Sie können Envvars wie folgt zum Laufen bringen: Skript. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH-Endskript
Martin Carpenter
5

Nun, dieses Skript hat bei mir funktioniert:

# 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
quelle
3

Ich bin auch auf dieses Problem gestoßen, habe jedoch einen anderen Ansatz gewählt. Am einfachsten erhalten Sie die env-Variablen, indem Sie den Befehl source verwenden und auf die Datei apache envvars verweisen. Anschließend können Sie apache mit den Optionen -D FOREGROUND ausführen

Im Grunde brauchen Sie ein Skript, das so aussieht (meins befindet sich in /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

Dann machen Sie es ausführbar und weisen den Supervisor auf seinen Standort. Sie müssen auch das Stoppsignal 6 verwenden

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

In den beiden ersten Zeilen des Skripts wird die Prozessgruppen-ID des Skripts abgefangen und ein Trap festgelegt, der auf Signalen ausgeführt wird, die an den Prozess übergeben werden. Dieser Trap führt einen Kill mit einer negativen Prozess-ID des übergeordneten Elements aus, das alle Apache2-Prozesse (das Skript) ausführt selbst) - Töten mit einer negativen PID bedeutet, alle Kinder eines solchen Prozesses zu töten (also in diesem Fall alle Apache2-Prozesse), ohne dass ich den Supervisor nicht dazu bringen könnte, die Apache2-Prozesse zu töten

Das Stoppsignal 6 wird verwendet, da ich kein anderes Signal finden konnte, das die Falle auslösen könnte, die 9 nicht abgefangen werden kann und 2 und 3 nichts tun (das Skript wird nicht getötet).

Danach sollte es reibungslos funktionieren, ohne Änderungen an der Apache2-Konfiguration

Roman Buczynski
quelle
2

Einige Posts von Scott James Remnant zum Thema, von denen ich hoffe, dass sie Ihnen helfen können:

8128
quelle
OK, also gehen sie in die Geschichte über die Überwachung von Dämonen und einige der blutigen Details ein. Es ist immer noch kein Skript für von Upstart überwachten Apache, und es gibt mehr Details in der Dokumentation zu Upstart. Ich vermute, dass die endgültige Antwort auf diese Frage "schreib es selbst" sein wird.
Ben Williams
0

Oh ja, in der Regel lautet die Antwort "Schreiben Sie Ihre eigenen". Mein entsprechend typischer Vorschlag wäre, die Seite " Erste Schritte - Upstart" zu konsultieren und ... abzutippen.

Ich hoffe, dass jemand, der sich mit dem Thema besser auskennt als ich, ein funktionierendes Upstart-Skript entwickelt.

ΤΖΩΤΖΙΟΥ
quelle
0

Ich würde einen Ansatz verwenden, der dem von Ben Williams sehr ähnlich ist, aber -D FOREGROUNDstattdessen -D NO_DETACH.

isoma
quelle