nadzorowany przez Skrypt startowy dla Apache?

16

Chcę uruchomić apache na Ubuntu 10.04 i używać ładnych elementów nadzoru na początku (nie mówię tylko o skrypcie inicjującym apache, ale odpowiedni nadzór usługi a la daemontools - to znaczy, restartowanie apache po jego śmierci, rzeczy tak).

Czy ktoś ma działającą konfigurację upstart do nadzorowania apache na Ubuntu 10.04?

Google nie pomogło mi, ale możliwe, że mój google-fu jest słaby.

Ben Williams
źródło
2
Też chciałbym o tym wiedzieć. Prowadzę wiele rzeczy (głównie procesy Django) i chciałbym zrzucić moje delikatne skrypty inicjujące, aby uzyskać coś bardziej niezawodnego. Nie zastanawiałem się nad tym, ale jeśli
Oli
1
Powinienem powiedzieć, że moją normalną metodą nadzoru jest używanie daemontools. Jestem trochę zaskoczony, że w nowym świecie upstart-ubuntu nikt nie korzystał z nadzoru serwisowego upstart, o ile mogłem stwierdzić w Google. Spodziewałem się, że będzie to rozwiązany problem.
Ben Williams

Odpowiedzi:

10

Woooo!

Napisałem własną wersję, która prawie działa - z pewnym hakowaniem plików conf i używaniem -D NO_DETACH.

Najpierw miałem do zbioru User, Groupa PidFilew /etc/apache2/apache2.confręcznie, zamiast mieć je mocno w światło /etc/apache2/envvars. Nie udało mi się znaleźć sposobu na prawidłowe wyeksportowanie tych zmiennych (próbowałem obu envi exportzgodnie z http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , ale nic dobrego).

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

To jest moja praca /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

Mogę robić start|stop|status|reload apache2i uzyskiwać znaczące wyniki; jeśli jestem kill -9głównym procesem apache, natychmiast się odradza i uruchamia się i zatrzymuje przy starcie zgodnie z oczekiwaniami. Myślę, że działa całkiem dobrze.


Próbowałem rzeczy, których nie mogłem uruchomić.

  • Próbowałem usunąć -D NO_DETACH, w połączeniu z:
spodziewaj się widelca
spodziewaj się demona

Nie udało się uruchomić usługi.

  • Próbowałem użyć podobnej metody /etc/apache2/envvarsdo zapełnienia ${APACHE_*}zmiennych:
eksport APACHE_RUN_USER = dane www
eksport APACHE_RUN_GROUP = dane www
eksport APACHE_PID_FILE = / var / run / apache2.pid

Nie udało się uruchomić i wystąpił błąd apache2: bad user name ${APACHE_RUN_USER}.

  • Próbowałem wyjścia konsoli i domyślnych opcji konsoli; w tym momencie naprawdę po prostu wymachiwałem, próbując uzyskać sensowne komunikaty o błędach. Wydawało się, że nie ma znaczenia.

    console output

  • Przydało się to do debugowania wiadomości apache:

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

  • To była kolejna próba nie zmodyfikowania, /etc/apache2/apache2.confktóra się nie powiodła:

    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
źródło
Jedną rzeczą, na którą należy zwrócić uwagę ... „start on runlevel [2345]” może rozpocząć się przed skonfigurowaniem interfejsów sieciowych. Więc eth0 może być „włączony”, ale może nie być gotowy do użycia. Podobnie możesz nie mieć żadnych lokalnych systemów plików. Jednym ze stosowanych standardów jest start na (lokalne systemy plików i net-device-up IFACE! = Lo).
SpamapS
ciekawy! Maszyna, o której mowa, nie była ponownie uruchamiana przez jakiś czas, więc byłbym zainteresowany przetestowaniem jej. Dzięki za wskazówkę.
Ben Williams,
1
Cześć, świetne pytanie, jeszcze lepsza odpowiedź :) Możesz uzyskać envvary działające w następujący sposób: skrypt. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH skrypt końcowy
Martin Carpenter
5

Ten skrypt działał dla mnie:

# 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
źródło
3

Uderzyłem również w ten problem, jednak zastosowałem inne podejście. Najłatwiejszym sposobem uzyskania zmiennych env jest użycie polecenia source i skierowanie go do pliku envvars apache, a następnie można uruchomić apache z opcjami -D FOREGROUND

więc w zasadzie potrzebujesz skryptu, który wygląda tak (mój jest w /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

Następnie ustaw go jako wykonywalny i wskaż przełożonemu jego lokalizację, musisz także użyć znaku stop 6

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

Dwie pierwsze linie skryptu przechwytują identyfikator grupy procesów skryptu i ustawiają pułapkę, która działa na sygnałach przekazywanych do procesu - pułapka ta wykonuje zabicie z ujemnym identyfikatorem procesu rodzica, który uruchamia wszystkie procesy Apache2 (skrypt sama) - zabicie z ujemnym PID oznacza również zabicie wszystkich dzieci takiego procesu (więc w tym przypadku wszystkich procesów apache2), bez tego nie byłem w stanie zmusić przełożonego do zabicia procesów apache2

Używa się stopign 6, ponieważ nie mogłem sfinalizować żadnego innego sygnału, który mógłby wywołać pułapkę, 9 nie może zostać złapane, a 2 i 3 nic nie robią (skrypt nie jest zabity)

potem powinien działać płynnie, bez żadnych modyfikacji konfiguracji apache2

Roman Buczyński
źródło
2

Kilka postów od Scotta Jamesa Remnanta na temat, który mam nadzieję może ci pomóc:

8128
źródło
OK, więc przejrzą trochę historii o udoskonalonych demonach nadzorczych i niektóre krwawe szczegóły. Nadal nie jest to skrypt apache nadzorowany przez upstart, a dokumentacja upstart zawiera więcej szczegółów. Podejrzewam, że ostateczną odpowiedzią na to będzie „napisz to sam”.
Ben Williams
0

Och, tak, zazwyczaj odpowiedzią będzie „napisz własną”, więc moją typową propozycją byłoby zajrzeć na stronę Pierwsze kroki - na początku i… napisz.

Mam nadzieję, że ktoś bardziej kompetentny w tej kwestii niż ja wpadnie na działający skrypt wstępny.

ΤΖΩΤΖΙΟΥ
źródło
0

Użyłbym podejścia podobnego do Bena Williamsa, ale -D FOREGROUNDzamiast niego -D NO_DETACH.

izoma
źródło