Я хочу запустить apache в Ubuntu 10.04 и использовать приятные инструменты для надзора в upstart (я говорю не только о скрипте apache init, но и о надлежащем надзоре за обслуживанием a la daemontools - то есть перезапуске apache при его запуске). умирает, такие вещи).
У кого-нибудь есть запущенная конфигурация upstart для контроля над Apache в Ubuntu 10.04?
Googles мне не помогли, но, возможно, мой google-fu слабый.
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
, в сочетании с:expect fork expect daemon
Этому не удалось запустить сервис.
/etc/apache2/envvars
заполнить ${APACHE_*}
переменные:export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data export APACHE_PID_FILE=/var/run/apache2.pid
Это не удалось запуститься и произвело ошибку о apache2: bad user name ${APACHE_RUN_USER}
.
Испытанный консольный вывод и консольные опции по умолчанию; в этой точке я действительно просто крутился о попытке получить значимые сообщения об ошибках. Казалось, не имел никакого значения.
console output
Это было полезно для отладки апачских сообщений:
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
Я бы использовал такой же подход, как работы Бен Уильямса , но с -D FOREGROUND
вместо -D NO_DETACH
.
Несколько сообщений от Scott James Remnant по теме, что я надеюсь, могут помочь Вам:
О, да, обычно ответом будет «напиши свое», поэтому мое типичное предложение - обратиться к странице Getting Started - upstart и… напечатать.
Я надеюсь, что кто-то более знающий в этом вопросе, чем я, придумает рабочий сценарий выскочки.
Я также столкнулся с этой проблемой, однако я использовал другой подход. Самый простой способ получить переменные 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
Ну, этот сценарий работал для меня:
# 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