инициируемый сценарий инициализации для Apache?

16

Я хочу запустить apache на Ubuntu 10.04 и использовать приятные средства наблюдения в upstart (я говорю не только о скрипте инициализации apache, но и о надлежащем надзоре за сервисом в духе daemontools - то есть перезапуске apache, когда он умирает, как это).

У кого-нибудь есть запущенный конфиг upstart для наблюдения за apache на ubuntu 10.04?

Googles мне не помогли, но, возможно, мой google-fu слаб.

Бен Уильямс
источник
2
Я тоже хотел бы знать об этом. Я размещаю много вещей (в основном процессы Django) и хотел бы выбросить свои хрупкие скрипты инициализации для чего-то более надежного. Не считал выскочкой, но если это сработает ...
Оли
1
Я должен сказать, что мой обычный метод наблюдения - использовать daemontools. Я немного удивлен, что в новом мире upstart-ubuntu никто, как я мог сказать в моем поиске в Google, не использовал контроль службы upstart. Я ожидал, что это будет решенной проблемой.
Бен Уильямс

Ответы:

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основной процесс Apache, он сразу же возрождается и запускается и останавливается при загрузке, как и ожидалось. Так что это работает достаточно хорошо, я считаю.


Были вещи, которые я пробовал, но не мог работать.

  • Пытался удалить -D NO_DETACH, в сочетании с:
ожидать форк
ожидать демона

Не удалось запустить службу.

  • Попытался использовать аналогичный метод /etc/apache2/envvarsдля заполнения ${APACHE_*}переменных:
экспорт APACHE_RUN_USER = www-данные
экспорт APACHE_RUN_GROUP = www-данные
export 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

Бен Уильямс
источник
Одна вещь, которую следует остерегаться ... 'start on runlevel [2345]' может начаться до того, как будут настроены сетевые интерфейсы ... поэтому eth0 может быть "активен", но он может быть не готов к использованию. Кроме того, у вас может не быть локальных файловых систем. Вместо этого использовался один из стандартных стандартов: start on (локальные файловые системы и сетевое устройство IFACE! = Lo).
SpamapS
интересный! Данная машина некоторое время не перезагружалась, поэтому мне было бы интересно проверить ее. Спасибо за чаевые.
Бен Уильямс
1
Привет, отличный вопрос, еще лучше ответ :) Вы можете настроить envvars следующим образом: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH end script
Мартин Карпентер
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
tmueko
источник
3

Я также столкнулся с этой проблемой, однако я использовал другой подход. Самый простой способ получить переменные env - использовать исходную команду и указать ее в файле 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

Пара сообщений от Скотта Джеймса Ремнанта на тему, которая, я надеюсь, может вам помочь:

8128
источник
Итак, они углубляются в историю о выскочивших надзирающих демонах и некоторых кровавых деталях. Это все еще не сценарий для Apache под наблюдением выскочки, и есть больше деталей в документации выскочки. Я подозреваю, что окончательный ответ на этот вопрос будет «напиши сам».
Бен Уильямс
0

О, да, обычно ответом будет «напиши свое», поэтому мое типичное предложение - обратиться к странице « Начало работы - выскочка» и… напечатать.

Я надеюсь, что кто-то более знающий в этом вопросе, чем я, придумает рабочий сценарий выскочки.

ΤΖΩΤΖΙΟΥ
источник