script de inicialização supervisionado para o Apache?

16

Eu quero rodar o apache no Ubuntu 10.04 e usar o bom material de supervisão no iniciante (não estou falando apenas do script init do apache, mas da supervisão adequada de serviço à la daemontools - ou seja, reiniciando o apache quando ele morrer, coisas Curtiu isso).

Alguém tem uma configuração inicial para supervisionar o apache no ubuntu 10.04?

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

Ben Williams
fonte
2
Eu gostaria de saber sobre isso também. Eu hospedo muitas coisas (principalmente processos do Django) e gostaria de despejar meus frágeis scripts init por algo um pouco mais robusto. Não tinha considerado arrogante, mas se ele funciona ...
Oli
11
Devo dizer que meu método normal de supervisão é usar daemontools. Estou um pouco surpreso que, no novo mundo iniciante do Ubuntu, ninguém tenha usado a supervisão de serviço do iniciante, tanto quanto pude perceber no meu blog. Eu esperava que fosse um problema resolvido.
Ben Williams

Respostas:

10

Woooo!

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

Primeiro, eu tinha de conjunto User, Groupe PidFileem /etc/apache2/apache2.confmanualmente, em vez de tê-los vindo /etc/apache2/envvars. Não consegui descobrir uma maneira de exportar esses Vars corretamente (tentei ambos enve de exportacordo com http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , 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 é o 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 apache2e obter resultados significativos; se kill -9o processo principal do apache, ele é reaparecido praticamente imediatamente, e inicia e pára na inicialização conforme o esperado. Então, está funcionando razoavelmente bem, eu acho.


Tentei algumas coisas que não consegui trabalhar.

  • Tentou remover -D NO_DETACH, em conjunto com:
esperar garfo
esperar daemon

Falha ao iniciar o serviço.

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

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

  • Tentativa de saída do console e opções padrão do console; Nesse ponto, eu estava realmente tentando entender mensagens de erro significativas. Parecia não fazer diferença.

    console output

  • Isso foi útil para depurar mensagens apache:

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

  • Essa foi outra tentativa de não modificar /etc/apache2/apache2.confa falha:

    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
fonte
Uma coisa a observar .. 'start on runlevel [2345]' pode ser iniciada antes da configuração das interfaces de rede. Portanto, eth0 pode estar "ativo", mas pode não estar pronto para uso. Da mesma forma, você pode não ter nenhum sistema de arquivos local. Um padrão usado em vez disso é o start on (sistemas de arquivos locais e IFACE! = Lo).
SpamapS
interessante! A máquina em questão não foi reinicializada por um tempo, então eu estaria interessado em fazer um teste. Obrigado pela dica.
Ben Williams
11
Olá, ótima pergunta, resposta ainda melhor :) Você pode fazer com que os envvars funcionem da seguinte maneira: script. / etc / apache2 / exec envvars / usr / sbin / apache2 -D NO_DETACH script final
Martin Carpenter
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
tmueko
fonte
3

Eu também atingi esse problema, no entanto, usei outra abordagem. A maneira mais fácil de obter as variáveis ​​env é usar o comando source e apontá-lo para o arquivo apache envvars, para que você possa executar o apache com as opções -D FOREGROUND

Então, basicamente, você precisa de um script parecido com este (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

Em seguida, você o torna executável e aponta o supervisor para a sua localização. Você também precisa usar o sinal de parada.

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

As duas primeiras linhas do script capturam o ID do grupo de processos e definem uma interceptação que é executada nos sinais passados ​​para o processo - essa interceptação executa uma interrupção com um ID de processo negativo do pai que executa todos os processos apache2 (o script - matar com um PID negativo significa matar todos os filhos desse processo (assim, neste caso, todos os processos apache2), sem que eu não fosse capaz de fazer o supervisor matar os processos apache2

O sinal de parada 6 é usado, pois eu não consegui encontrar nenhum outro sinal que pudesse invocar a armadilha, o 9 não pode ser capturado e 2 e 3 não fazem nada (o script não é morto)

depois disso, ele deve funcionar sem problemas, sem nenhuma modificação na configuração do apache2

Roman Buczynski
fonte
2

Algumas postagens de Scott James Remnant sobre o tópico que espero que possam ajudá-lo:

8128
fonte
OK, então eles contam um pouco da história sobre daemons supervisores iniciantes e alguns dos detalhes sangrentos. Ainda não é um script para o apache supervisionado pelo iniciante, e há mais detalhes na documentação do iniciante. Eu suspeito que a resposta final para isso será "escreva você mesmo".
Ben Williams
0

Ah, sim, normalmente a resposta será "escreva você mesmo", então minha sugestão típica seria consultar a página Introdução - iniciante e ... digitar.

Espero que alguém com mais conhecimento sobre o assunto do que eu crie um script inicial de trabalho.

ΤΖΩΤΖΙΟΥ
fonte
0

Eu usaria uma abordagem muito parecida com a de Ben Williams, mas com em -D FOREGROUNDvez de -D NO_DETACH.

isoma
fonte