Назад | Перейти на главную страницу

Как запустить nginx через выскочку?

Задний план:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

Я построил nginx и хотел бы использовать выскочку для его запуска:

Скрипт выскочки nginx с сайта:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

Я получаю «неизвестное задание», когда пытаюсь использовать initctl для его запуска, что, как я только что узнал, по-видимому, означает наличие ошибки (что не так с «Ошибка» для описания ошибок?)

Может ли кто-нибудь указать мне правильное направление? Я прочитал документацию, как она есть, и она кажется немного скудной для замены SysV init ... но все, что нужно, просто добавить это задание в список, запустить его и продолжить то, что осталось от моей жизни. .. Какие-нибудь советы?

РЕДАКТИРОВАТЬ: initctl версии init (выскочка 0.6.5)

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

Я взял сценарий Upstart из Nginx Wiki и изменил его, так как некоторые строки не нужны, вызывают путаницу или не работают.

Вам может потребоваться изменить env DAEMON и env PID строки в зависимости от того, где вы установили nginx и пишете PID. PID можно настроить в nginx.

Я пробовал все формы expect. Только expect fork вроде работает. С помощью Passenger nginx создает 61 вилку. Upstart требует 0, 1 или 2. Как намекали другие, Upstart будет отслеживать неправильный PID. Я также удалил respawn поскольку он ничего не делает, вероятно, по той же причине. Некоторые дополнительные сценарии до и после запуска могут исправить это, получив реальный PID. Однако я использую monit для обработки перезапусков, поэтому в этом нет необходимости.

Не используй daemon off. Это только для разработки. Видеть http://wiki.nginx.org/CoreModule#daemon

Ссылки:

Ты не можешь. По крайней мере, не совсем правильно.

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

Вы не можете иметь несколько stop on директивы в описании вакансии выскочки для Upstart> = 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

Есть Пример файла конфигурации Upstart в NGINX Вики.

Возможно, вам потребуется изменить путь к двоичному файлу 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.

Я использую:

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 который просто отправляет вывод консоли на стандартный вывод. По умолчанию вывод консоли просто отправляется регистратору.

Вы можете увидеть все строфа документы по Выскочка вики

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 для большего.

Как ни странно, ни один из ответов здесь на самом деле не работает полностью, поскольку они оставляют выскочку в состоянии остановки / уничтожения, что предотвращает работу другого запуска. Это означает, что restart nginx терпит неудачу.

Ошибка с выскочкой хорошо документирована на https://bugs.launchpad.net/upstart/+bug/406397 и я удивлен, что автор выскочки, похоже, недостаточно заботится о том, чтобы исправить это. Единственное работающее решение, которое я видел, это следующее (украдено из того же отчета об ошибке):

# 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

Преимущество такого написания в том, что работает даже респаун. Недостаток в том, что это некрасивый и неприятный прием.