guión de inicio supervisado para Apache?

16

Quiero ejecutar apache en Ubuntu 10.04, y usar las buenas funciones de supervisión en el inicio (no solo estoy hablando del script de inicio de apache, sino de la supervisión de servicio adecuada a la daemontools, es decir, reiniciar apache cuando muere, cosas como eso).

¿Alguien tiene una configuración de arranque para supervisar apache en ubuntu 10.04?

Los Google no me han ayudado, pero podría ser que mi google-fu es débil.

Ben Williams
fuente
2
Me gustaría saber sobre esto también. Alojo muchas cosas (principalmente procesos de Django) y me gustaría volcar mis scripts de inicio frágiles por algo un poco más robusto. No había considerado advenedizo pero si funciona ...
Oli
1
Debo decir que mi método de supervisión normal es usar Daemontools. Estoy un poco sorprendido de que en el nuevo mundo de upstart-ubuntu, nadie haya usado la supervisión de servicio de upstart, por lo que pude ver en mi google. Esperaba que fuera un problema resuelto.
Ben Williams

Respuestas:

10

Woooo!

He escrito mi propia versión que está funcionando bastante bien, con algo de pirateo y uso de archivos conf -D NO_DETACH.

En primer lugar, tuve que conjunto User, Groupy PidFileen /etc/apache2/apache2.confforma manual, en lugar de tenerlas que viene de /etc/apache2/envvars. No pude encontrar una manera de exportar esos vars correctamente (probé ambos envy exportsegún http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , pero no es bueno).

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

Entonces, este es mi trabajo /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

Puedo hacer start|stop|status|reload apache2y obtener resultados significativos; Si kill -9el proceso de Apache maestro, se reaparece casi inmediatamente, y comienza y se detiene en el arranque como se esperaba. Así que creo que funciona bastante bien.


Intenté cosas que no pude conseguir trabajando.

  • Intenté eliminar -D NO_DETACH, junto con:
esperar tenedor
esperar demonio

Eso no pudo iniciar el servicio.

  • Intenté usar un método similar /etc/apache2/envvarspara poblar las ${APACHE_*}variables:
export APACHE_RUN_USER = www-data
export APACHE_RUN_GROUP = www-data
export APACHE_PID_FILE = / var / run / apache2.pid

Eso no pudo comenzar y produjo un error al respecto apache2: bad user name ${APACHE_RUN_USER}.

  • Probado salida de consola y opciones predeterminadas de consola; en este punto, realmente estaba fallando sobre tratar de obtener mensajes de error significativos. Parecía no hacer la diferencia.

    console output

  • Esto fue útil para depurar mensajes de apache:

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

  • Este fue otro intento de no modificar /etc/apache2/apache2.confque falló:

    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
fuente
Una cosa a tener en cuenta ... 'start on runlevel [2345]' puede comenzar antes de configurar las interfaces de red ... por lo que eth0 puede estar "activo" pero puede que no esté listo para su uso. Del mismo modo, es posible que no tenga ningún sistema de archivos local. Un estándar que se ha utilizado en su lugar es iniciar en (sistemas de archivos locales e IFACE de dispositivo de red! = Lo).
SpamapS
¡interesante! La máquina en cuestión no se ha reiniciado por un tiempo, por lo que me interesaría probarlo. Gracias por el consejo.
Ben Williams
1
Hola, gran pregunta, incluso mejor respuesta :) Puedes hacer que los envvars trabajen de la siguiente manera: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH final script
Martin Carpenter
5

Bueno, este script funcionó para mí:

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

También me encontré con este problema, sin embargo, utilicé otro enfoque. La forma más fácil de obtener las variables env es usar el comando fuente y apuntarlo al archivo apache envvars, luego puede ejecutar apache con las opciones -D FOREGROUND

así que básicamente necesitas un script que se vea así (el mío está en /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

Luego lo hace ejecutable y señala al supervisor a su ubicación, también debe usar la señal de detención 6

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

Las dos primeras líneas del script capturan el ID del grupo de procesos del script y establecen una trampa que se ejecuta en las señales que se transmiten al proceso; esta trampa ejecuta un kill con un ID de proceso negativo del padre que ejecuta todos los procesos apache2 (el script en sí): matar con un PID negativo significa matar a todos los hijos de dicho proceso también (por lo que en este caso todos los procesos apache2), sin eso no pude hacer que el supervisor matara los procesos apache2

La señal de stop 6 se usa porque no pude encontrar ninguna otra señal que pudiera invocar la trampa, el 9 no se puede atrapar y 2 y 3 no hacen nada (el guión no se elimina)

después de eso debería funcionar sin problemas, sin modificaciones en la configuración de apache2

Roman Buczynski
fuente
2

Un par de publicaciones de Scott James Remnant sobre el tema que espero puedan ayudarte:

8128
fuente
OK, entonces van a algo de la historia sobre los demonios supervisores principiantes y algunos detalles sangrientos. Todavía no es una secuencia de comandos para apache supervisado por arranque y hay más detalles en la documentación de arranque. Sospecho que la respuesta final a esto será "escríbelo tú mismo".
Ben Williams
0

Ah, sí, por lo general, la respuesta será "escriba la suya", por lo que mi sugerencia, en consecuencia, sería consultar la página de inicio - inicio y ... escribir.

Espero que alguien con más conocimientos sobre el tema que yo presente un script de arranque.

ΤΖΩΤΖΙΟΥ
fuente
0

Usaría un enfoque muy parecido al de Ben Williams pero con en -D FOREGROUNDlugar de -D NO_DETACH.

isoma
fuente