У Вас не может быть нескольких stop on
директивы в новомодной должностной инструкции для Выскочки> = 0.5.
И console owner
вероятно, не, что Вы хотите (это делает nginx владельцем системной консоли).
Попытка:
description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
respawn
Я использую:
description "Nginx HTTP Server"
start on filesystem
stop on runlevel [!2345]
respawn
exec /opt/nginx/sbin/nginx -g "daemon off;"
Остановка runlevel [!...]
кажется, является более стандартным. Это - то, что запас ssh/samba сценарии делают. Необходимо также добавить respawn
бит, таким образом, это перезапускает, если это умирает. Я также не уверен, почему Вы хотите console output
это просто отправляет консольный вывод в stdout. Поведение по умолчанию состоит в том, чтобы просто отправить консольный вывод на регистратор.
Вы видите все документы строки файла конфигурации о Выскочке Wiki
description "nginx"
start on (net-device-up and local-filesystems)
stop on runlevel [016]
expect fork
respawn
exec /usr/sbin/nginx
См. http://geeknme.wordpress.com/2009/10/15/getting-started-with-upstart-in-ubuntu для больше.
Вы не можете. По крайней мере, не правильно, так или иначе.
Nginx не порождает своего демона одним из двух способов, которыми требует выскочка, или через “ожидают, что ветвление” или “ожидает демона”, таким образом, выскочка будет не мочь отследить основной процесс nginx. Существуют некоторые взломы, но у них есть свои собственные проблемы.
Если Вы будете хорошо с тем, что выскочка не может отслеживать основной процесс и уничтожить его на завершении работы, то это будет работать:
start on local-filesystems \
and (net-device-added INTERFACE=lo) \
and (runlevel [12345])
stop on runlevel [06]
env DAEMON=/usr/sbin/nginx
respawn
respawn limit 10 5
expect daemon
pre-start script
$DAEMON -t
end script
$DAEMON
В NGINX Wiki есть пример файла конфигурации Upstart .
Возможно, вам потребуется изменить путь к nginx двоичный файл в файле конфигурации.
Этот файл конфигурации у меня отлично работает с Ubuntu 10.04 и nginx 1.0.5.
Я также установил символическую ссылку nginx
в /etc/init.d
, указывающую на / lib / init / upstart-job
, чтобы я мог использовать стандартную команду service
для запуска и остановки nginx
.
Примечание: Если вы установите Phusion Passenger с NGINX, возможно, вам потребуется добавить следующую строку в сценарий конфигурации Upstart:
env PID=/opt/nginx/logs/nginx.pid
post-stop script
start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script
Я счел это необходимым в моей конфигурации Ubuntu. В противном случае, когда я выполнил initctl stop nginx
или service nginx stop
, nginx фактически не остановился. Я также заметил, что Upstart думал, что у процесса nginx есть PID, который на самом деле был PID одного из процессов Passenger. Итак, очевидно, что NGINX / Passenger немного сбивает с толку Upstart.
Я оказывался здесь несколько раз, поэтому подумал, что дам обновленный ответ, основанный на моем собственном опыте, после того, как использовал ответы здесь. Особая благодарность @danorton и @orj за их ответы.
Этот скрипт был протестирован на Upstart 1.5, работающем в Ubuntu 12.04 с Nginx 1.0.11 и Passenger 3.0.11. Если вы не используете Passenger, возможно, вам придется поиграть с линией post-stop
. Обратитесь к кулинарной книге Upstart.
В пустой /etc/init/nginx.conf
добавьте следующие строки (вы можете удалить комментарии, если хотите):
description "nginx http daemon"
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid
# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork
# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t
# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT
# Start Nginx
exec $DAEMON
I ' я взял сценарий Upstart из Nginx Wiki и изменил его, так как ряд строк не нужен, вызывает путаницу или не работает.
Возможно, вам потребуется изменить env DAEMON
и env PID
строк в зависимости от того, где вы установили nginx и записываете PID. PID можно настроить в nginx.
Я пробовал все формы ожидать
. Кажется, работает только expect fork
. С помощью Passenger nginx создает 61 вилку. Upstart требует 0, 1 или 2. Как другие намекнули, Upstart будет отслеживать неправильный PID. Я также удалил респаун
, поскольку он ничего не делает, вероятно, по той же причине. Некоторые дополнительные сценарии до и после запуска могут исправить это, получив реальный PID. Я, однако, использую monit для обработки перезапусков, поэтому в этом нет необходимости.
Не используйте daemon off
. Это только для разработки. См. http://wiki.nginx.org/CoreModule#daemon
Ссылки:
Oddly none of the answers here actually works fully as they leave upstart in a stop/killed state which prevents another start working. This means that restart nginx
fails.
The bug with upstart is well documented at https://bugs.launchpad.net/upstart/+bug/406397 and I'm astonished that the author of upstart doesn't seem to care enough to fix it. The only solution I've seen that works is the following (stolen from the same bug report):
# nginx - Nginx Web Server
#
description "Nginx Web Server"
start on (local-filesystems and
(net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]
env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid
respawn
pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof > /dev/null $DAEMON;
then
$DAEMON -s stop
fi
end script
The advantage of writing it like this is that even the respawn works. The disadvantage is that it's ugly and a nasty hack.
man 5 init
– Jacek Konieczny 22 May 2010 в 10:18