script di avvio supervisionato per Apache?


16

Voglio eseguire apache su Ubuntu 10.04 e usare le belle cose di supervisione all'inizio (non sto solo parlando dello script di apache init, ma di una supervisione adeguata del servizio da parte di demontools - 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.


2
Vorrei sapere anche questo. Ospito molte cose (principalmente i processi di Django) e vorrei scaricare i miei fragili script init per qualcosa di un po 'più robusto. Non avevo preso in considerazione l'avvio, ma se funziona ...
Oli

1
Devo dire che il mio normale metodo di supervisione è usare i daemontools. Sono un po 'sorpreso che nel nuovo mondo di Ubuntu, nessuno abbia usato la supervisione del servizio di Upstart, per quanto ne so nel mio google. Mi aspettavo che fosse un problema risolto.
Ben Williams,

Risposte:


10

Woooo!

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

Prima di tutto, ho dovuto impostare User, Groupe PidFilein /etc/apache2/apache2.confmano, piuttosto che averli proveniente da /etc/apache2/envvars. Non sono riuscito a trovare un modo per esportare correttamente quei var (ho provato entrambi enve exportcome su http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , ma non va bene).

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

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 apache2e ottenere risultati significativi; se ho kill -9il processo master 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 cercato di rimuovere -D NO_DETACH, insieme a:
aspettiamo forchetta
aspettiamo demone

Non è stato possibile avviare il servizio.

  • Ho provato a usare un metodo simile /etc/apache2/envvarsper popolare le ${APACHE_*}variabili:
esporta APACHE_RUN_USER = www-data
esporta APACHE_RUN_GROUP = www-data
export APACHE_PID_FILE = / var / run / apache2.pid

Ciò non è stato avviato e ha prodotto un errore apache2: bad user name ${APACHE_RUN_USER}.

  • Provato output della console e 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

  • Questo è 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.confche 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


Una cosa a cui fare attenzione .. 'start on runlevel [2345]' potrebbe iniziare prima che le interfacce di rete siano configurate .. quindi eth0 potrebbe essere "attivo" ma potrebbe non essere pronto per l'uso. Allo stesso modo, potresti non avere filesystem locali. Uno standard che è stato utilizzato invece è start on (local-filesystems e net-device-up IFACE! = Lo).
SpamapS

interessante! La macchina in questione non è stata riavviata da un po ', quindi sarei interessato a fare un test. Grazie per il consiglio.
Ben Williams,

1
Ciao, bella domanda, risposta ancora migliore :) Puoi far funzionare envvars come segue: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH end script
Martin Carpenter

5

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

3

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 apache envvars, 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


2

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


OK, quindi entrano nella storia della supervisione iniziale dei demoni e di alcuni dettagli cruenti. Non è ancora uno script per apache supervisionato da upstart e, ci sono più dettagli nella documentazione upstart. Sospetto che la risposta finale a questo sarà "scriverlo tu stesso".
Ben Williams,

0

Oh, sì, in genere la risposta sarà "scrivi la tua", quindi il mio suggerimento tipico di conseguenza sarebbe di consultare la Pagina iniziale - per iniziare e ... digitare via.

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


0

Userei un approccio molto simile a quello di Ben Williams ma con -D FOREGROUNDinvece di -D NO_DETACH.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.