wake-up-neo.net

script di avvio supervisionato per Apache?

Voglio eseguire Apache su Ubuntu 10.04 e usare le cose di supervisione di Nizza all'inizio (non sto solo parlando dello script di Apache init, ma di una supervisione del servizio adeguata alla demarcazione - vale a dire, riavviando Apache quando muore, cose come quello).

Qualcuno ha una configurazione upstart in esecuzione per la supervisione di Apache su Ubuntu 10.04?

I googles non mi sono stati d'aiuto, ma è possibile che il mio google-fu sia debole.

16
Ben Williams

Woooo!

Ho scritto la mia versione che funziona praticamente, con un po 'di hacking dei file conf e usando -D NO_DETACH.

Innanzitutto, ho dovuto impostare manualmente User, Group e PidFile in /etc/Apache2/Apache2.conf, anziché farli entrare da /etc/Apache2/envvars. Non sono riuscito a trovare un modo per esportare correttamente quei var (ho provato sia env che export come da http://manpages.ubuntu.com/manpages/lucid /man5/init.5.html , ma non va bene).

[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

Quindi, questo è il mio lavoro /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

Posso fare start|stop|status|reload Apache2 e ottenere risultati significativi; se kill -9 il processo principale di Apache, viene rigenerato praticamente immediatamente e si avvia e si arresta all'avvio come previsto. Quindi funziona ragionevolmente bene, credo.


Ci sono state delle cose che ho provato che non riuscivo a lavorare.

  • Ho provato a rimuovere -D NO_DETACH insieme a:
 prevede fork 
 prevede demone 

Non è stato possibile avviare il servizio.

  • Ho provato ad usare un metodo simile a /etc/Apache2/envvars per popolare le variabili ${Apache_*}:
 export Apache_RUN_USER = www-data 
 export Apache_RUN_GROUP = www-data 
 export Apache_PID_FILE =/var/run/Apache2.pid 

Non è stato avviato e ha generato un errore su Apache2: bad user name ${Apache_RUN_USER}.

  • Provato l'output della console e le opzioni predefinite della console; a questo punto mi stavo davvero sforzando di cercare di ottenere messaggi di errore significativi. Sembrava non fare differenza.

    console output

  • Ciò è stato utile per il debug dei messaggi Apache:

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

  • Questo è stato un altro tentativo di non modificare /etc/Apache2/Apache2.conf non riuscito:

    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

Bene, questa sceneggiatura ha funzionato per me:

# 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

Ho anche riscontrato questo problema, tuttavia ho usato un altro approccio. Il modo più semplice per ottenere le variabili env è usare il comando source e puntarlo al file envvars di Apache, quindi puoi eseguire Apache con le opzioni -D FOREGROUND

quindi in pratica hai bisogno di uno script che assomigli a questo (il mio è 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

Quindi lo rendi eseguibile e punti il ​​supervisore verso la sua posizione, devi anche usare il segnale di stop 6

command=/etc/Apache2/Apache2_foreground.sh
stopsignal=6

Le due prime righe nello script catturano l'ID del gruppo di processi dello script e impostano una trap che viene eseguita sui segnali passati al processo: questa trap esegue un kill con un ID di processo negativo del genitore che esegue tutti i processi Apache2 (lo script stesso) - uccidere con un PID negativo significa anche uccidere tutti i figli di tale processo (quindi in questo caso tutti i processi Apache2), senza che non fossi in grado di fare in modo che il supervisore uccidesse i processi Apache2

Il segnale di stop 6 viene utilizzato in quanto non sono riuscito a trovare nessun altro segnale che potrebbe invocare la trappola, il 9 non può essere catturato e 2 e 3 non fanno nulla (lo script non viene ucciso)

dopodiché dovrebbe funzionare senza problemi, senza alcuna modifica alla configurazione di Apache2

3
Roman Buczynski

Un paio di post di Scott James Remnant sull'argomento che spero possa aiutarti:

2
8128

Userei un approccio molto simile a Ben Williams's ma con -D FOREGROUND anziché -D NO_DETACH.

0
isoma

Oh, sì, in genere la risposta sarà “scrivi la tua”, quindi il mio suggerimento tipico sarebbe di consultare la pagina Guida introduttiva - inizio e ... digitare.

Spero che qualcuno più informato sulla questione di me abbia una sceneggiatura funzionante.

0