it-swarm-eu.dev

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

Ich möchte Apache unter Ubuntu 10.04 ausführen und das Nice-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 Start-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.

16
Ben Williams

Woooo!

Ich habe meine eigene Version geschrieben, die ziemlich gut funktioniert - mit etwas Conf-Datei-Hacking und der Verwendung von -D NO_DETACH.

Zuerst musste ich User, Group und PidFile in /etc/Apache2/Apache2.conf manuell einstellen, anstatt sie von /etc/Apache2/envvars eingeben zu lassen. Ich konnte nicht herausfinden, wie diese Vars ordnungsgemäß exportiert werden können (ich habe sowohl env als auch export gemäß http://manpages.ubuntu.com/manpages/lucid) versucht /man5/init.5.html , aber nicht gut).

[email protected]:/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 dies mein Arbeits /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 Apache2 ausführen und aussagekräftige Ergebnisse erzielen. Wenn ich den Master-Apache-Prozess kill -9 __e, wird er ziemlich sofort neu erzeugt und beim Booten wie erwartet gestartet und gestoppt. Es funktioniert also ziemlich gut, denke ich.


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

  • Versucht, -D NO_DETACH in Verbindung mit zu entfernen:
 Expect Fork 
 Expect Daemon 

Der Dienst konnte nicht gestartet werden.

  • Es wurde versucht, eine ähnliche Methode wie /etc/Apache2/envvars zu verwenden, um die ${Apache_*}-Variablen zu füllen:
 exportiere Apache_RUN_USER = www-Daten 
 exportiere Apache_RUN_GROUP = www-Daten 
 exportiere Apache_PID_FILE =/var/run/Apache2.pid 

Das konnte nicht gestartet werden und verursachte einen Fehler in Bezug auf 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, /etc/Apache2/Apache2.conf nicht zu ändern, der fehlgeschlagen ist:

    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

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

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 Apache-envvars-Datei 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 ausführt (das Skript) 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 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

3
Roman Buczynski

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

2
8128

Ich würde einen Ansatz wie Ben Williams's verwenden, aber mit -D FOREGROUND anstelle von -D NO_DETACH.

0
isoma

Oh ja, in der Regel lautet die Antwort "Schreiben Sie Ihre eigenen". Mein entsprechend typischer Vorschlag wäre, die Seite Getting Started - upstart zu konsultieren und ... wegzuschreiben.

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

0