script de inicialização supervisionado pelo upstart para o Apache?

15

Eu quero rodar o apache no Ubuntu 10.04, e usar as boas coisas de supervisão no iniciante (eu não estou falando apenas do script de inicialização do apache, mas da supervisão de serviço apropriada a daemontools - o que significa reiniciar o apache quando morre, coisas assim).

Alguém tem uma configuração do upstart em execução para supervisionar o apache no Ubuntu 10.04?

Os Googles não me ajudaram, mas pode ser que o meu google-fu seja fraco.

    
por Ben Williams 26.08.2010 / 01:49

6 respostas

10

Woooo!

Eu escrevi minha própria versão que está praticamente funcionando - com alguns hacks de arquivos conf e usando -D NO_DETACH .

Primeiro, eu tive que definir User , Group e PidFile in /etc/apache2/apache2.conf manualmente, em vez de tê-los vindo de /etc/apache2/envvars . Eu não consegui descobrir uma maneira de obter essas vars para serem exportadas corretamente (eu tentei tanto env como export conforme link , mas não é bom).

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

Então, este é meu trabalho /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

Eu posso fazer start|stop|status|reload apache2 e obter resultados significativos; se eu kill -9 o processo mestre do apache, ele é reaparecido imediatamente, e ele inicia e para na inicialização como esperado. Então está funcionando razoavelmente bem, eu acho.

Houve coisas que tentei que não consegui trabalhar.

  • Tentou remover -D NO_DETACH , em conjunto com:
expect fork
expect daemon

que não conseguiu iniciar o serviço.

  • Tentou usar um método semelhante a /etc/apache2/envvars para preencher as variáveis ${APACHE_*} :
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2.pid

Falha ao iniciar e produziu um erro sobre apache2: bad user name ${APACHE_RUN_USER} .

  • Tentei a saída do console e as opções padrão do console; Neste momento eu estava realmente apenas tentando obter mensagens de erro significativas. Parecia não fazer diferença.

    console output

  • Isso foi útil para depurar mensagens do apache:

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

  • Esta foi outra tentativa de não modificar /etc/apache2/apache2.conf que falhou:

    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

por Ben Williams 20.09.2010 / 06:45
5

Bem, esse script funcionou para mim:

# 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
    
por tmueko 22.10.2012 / 12:53
3

Também acertei esse problema, mas usei outra abordagem. A maneira mais fácil de obter as variáveis env é usar o comando source e apontá-lo para o arquivo envachei do apache, então você pode executar o apache com as opções -D FOREGROUND

Então, basicamente, você precisa de um script que se pareça com isso (o meu está em /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

Depois, você o torna executável e aponta o supervisor para a sua localização, você também precisa usar o sinal de stop 6

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

As duas primeiras linhas do script capturam o ID do grupo de processos do script e definem uma armadilha que é executada nos sinais transmitidos ao processo - essa armadilha executa uma kill com um ID de processo negativo do pai que executa todos os processos do apache2 (o script em si) - matar com um PID negativo significa matar todos os filhos de tal processo (assim, neste caso, todos os processos do apache2), sem que eu não fosse capaz de fazer o supervisor matar os processos do apache2

O stopignal 6 é usado porque eu não consegui achar nenhum outro sinal que pudesse invocar o trap, o 9 não pode ser capturado, e 2 e 3 não fazem nada (o script não é morto)

depois disso, deve funcionar sem problemas, sem modificações na configuração do apache2

    
por Roman Buczynski 18.09.2012 / 17:45
2

Duas postagens de Scott James Remnant sobre o tópico que espero poder ajudar você:

por 8128 29.08.2010 / 18:18
0

Ah, sim, normalmente a resposta será "escrever o seu próprio", então a minha sugestão típica seria consultar o Getting Started - upstart page and… digitando.

Espero que alguém mais experiente no assunto do que eu venha com um roteiro inicial de trabalho.

    
por ΤΖΩΤΖΙΟΥ 03.09.2010 / 01:37
0

Eu usaria uma abordagem muito parecida com Ben Williams's , mas com -D FOREGROUND em vez de -D NO_DETACH .

    
por isoma 25.05.2012 / 10:10