сценарій init під контролем на початку для Apache?


16

Я хочу запустити apache на Ubuntu 10.04 і використовувати приємні матеріали спостереження на початку (я не просто говорю про скрипт apache init, але і належний нагляд за сервісом a la daemontools - що означає, перезапуск апаша, коли він вмирає, речі так як це).

Хтось має конфігурацію запущеної версії для контролю апаша на ubuntu 10.04?

Google не допомогли мені, але може бути, що мій google-fu слабкий.


2
Я також хотів би знати про це. Я розміщую багато речей (головним чином процесів Джанго) і хотів би скинути свої тендітні сценарії init на щось трохи більш надійне. Не розглядав, як почати, але якщо це працює ...
Олі

1
Я повинен сказати, мій звичайний метод нагляду - це використання демомонтолів. Я трохи здивований, що в новому світі upstart-ubuntu ніхто не використовував нагляд за послугами upstart, наскільки я міг сказати в своєму googling. Я очікував, що це буде вирішена проблема.
Бен Вільямс

Відповіді:


10

Woooo!

Я написав свою власну версію, яка в значній мірі працює - з деяким хакерським файлом conf та використанням -D NO_DETACH.

Перш за все , я повинен був встановити User, Groupі PidFileв /etc/apache2/apache2.confвручну, а не мати їх , що надходять з /etc/apache2/envvars. Я не міг розробити спосіб належним експортом цих вар (я спробував і те, envі exportвідповідно до http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , але нічого поганого).

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

Потім це моя робота /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

Я можу зробити start|stop|status|reload apache2і отримати значущі результати; якщо я kill -9мастер процес апашшю, він знову відновлюється майже відразу, і він запускається і зупиняється на завантаженні, як очікувалося. Тому я вважаю, що це працює досить добре.


Були речі, які я намагався, і я не міг працювати.

  • Спробували видалити -D NO_DETACHспільно з:
очікуйте вила
очікуйте демона

Не вдалося запустити послугу.

  • Спробував застосувати аналогічний метод /etc/apache2/envvarsдля заселення ${APACHE_*}змінних:
експортувати APACHE_RUN_USER = www-дані
експортувати APACHE_RUN_GROUP = www-дані
експортувати APACHE_PID_FILE = / var / run / apache2.pid

Це не вдалося запустити, і виник помилка о apache2: bad user name ${APACHE_RUN_USER}.

  • Випробуваний вихід консолі та параметри за замовчуванням консолі; на даний момент я насправді просто бракував щодо спроби отримати змістовні повідомлення про помилки. Здається, це не має ніякого значення.

    console output

  • Це було корисно для налагодження повідомлень apache:

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

  • Це була ще одна спроба змінити /etc/apache2/apache2.confцю помилку:

    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


Одне, на що слід стежити .. 'запуск на runlevel [2345]' може початися до налаштування мережевих інтерфейсів .. тому eth0 може бути "вгору", але він може бути не готовий до використання. Так само у вас можуть не бути локальних файлових систем. Один стандарт, який використовується замість цього, запускається (локальні файлові системи та мережевий пристрій IFACE! = Lo).
SpamapS

цікаво! Машина, про яку йдеться, не перезавантажувалася деякий час, тому мені було б цікаво випробувати тест. Дякую за пораду.
Бен Вільямс

1
Привіт, чудове запитання, ще краща відповідь :) Ви можете отримати envvars, працюючи так: сценарій. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH кінцевий сценарій
Martin Carpenter

5

Цей сценарій працював для мене:

# 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

Я також потрапив у цю проблему, проте застосував інший підхід. Найпростіший спосіб отримати змінні env - це використовувати команду source та вказати її на файл apache envvars, тоді можна запустити apache за допомогою параметрів -D FOREGROUND

тому в основному вам потрібен сценарій, який виглядає приблизно так (мій знаходиться в /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

Потім ви зробите його виконуваним і наведіть наглядача на його місце розташування, вам також потрібно використовувати стопсигнал 6

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

Два перших рядка в скрипті вловлюють ідентифікатор групи процесів скрипту і встановлюють пастку, яка працює на сигнали, передані в процес - ця пастка виконує вбивство з негативним ідентифікатором процесу з боку батьків, який запускає всі процеси apache2 (сценарій себе) - вбивство з негативним PID означає також вбити всіх дітей такого процесу (тому в цьому випадку всі apache2 процеси), без цього я не зміг змусити керівника вбити процеси apache2

Стопсигнал 6 використовується, оскільки я не міг доопрацювати жоден інший сигнал, який міг викликати пастку, 9 не можна спіймати, а 2 і 3 нічого не роблять (сценарій не вбивається)

після цього він повинен працювати безперебійно, без змін у конфігурації apache2


2

Кілька публікацій від Скотта Джеймса Рементара на тему, яка, сподіваюся, може вам допомогти:


Гаразд, вони заглиблюються в деяку історію про випереджаючі наглядові демони та деякі деталі горі. Це все ще не сценарій для нагляду під керуванням запуску, а в документації на вищому запуску є більше деталей. Я підозрюю, що остаточною відповіддю на це стане «напишіть самі».
Бен Вільямс

0

О так, як правило, відповідь буде "написати своє", тому моєю відповідно типовою пропозицією було б проконсультуватися на сторінці " Початок роботи" - "startstart " і ... введіть текст.

Я сподіваюся, що хтось більш обізнаний у цьому питанні, ніж я, придумає робочий сценарій на початку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.