Как я могу запустить nginx через upstart?

9

Фон:

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

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

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

РЕДАКТИРОВАТЬ: initctl версия init (upstart 0.6.5)

chiggsy
источник
1
Один комментарий о «неизвестной работе» против «ошибки». Вы просто смотрите не в том месте. Initctl не читает файл конфигурации, он просто просит Upstart загрузить известное задание - и upstart не знает об этом, когда вы запускаете команду initctl. Ошибка произошла ранее, когда Upstart попытался прочитать файл задания. В системном журнале должно быть сообщение об ошибке (/ var / log / syslog, / var / log / messages или где бы ваша система ни сохраняла эти журналы)
Яцек Конечный
Кстати, получается, что в / sbin есть команды start и stop для заданий upstart. Они работали на меня. Теперь они ссылаются на initctl, поэтому я не уверен, почему они работают, но они работают.
Chiggsy

Ответы:

3

Вы не можете иметь несколько 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
Яцек Конечный
источник
Работа неизвестна, увы. Откуда вы получаете эту информацию? Мужчина? Информация? онлайн? Где документировано 0.6.5?
Чиггси
вроде работал ..
thnx
Да, трудно найти текущую документацию Upstart, по крайней мере, в Интернете. Но страница руководства довольно хорошая. Попробуйте: man 5 init
Яцек Конечны
1
Это неправильный способ запуска nginx на производственных серверах. daemon offОпция только для развития.
PhilT
16

Я оказывался здесь несколько раз, поэтому решил использовать обновленный ответ, основываясь на своем собственном опыте, после использования ответов здесь. Большое спасибо @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поскольку это ничего не делает, вероятно, по той же причине. Некоторые дополнительные скрипты pre / post-start могут исправить это, взяв настоящий PID. Я, однако, использую monit для обработки перезапусков, поэтому мне это не нужно.

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

Ссылки:

оборота PhilT
источник
1
Я думаю , что вы бы хотели запустить с помощью daemon off;так что выскочка часами правильного процесса / PID без необходимости для expect forkили post-stopдиректив. Раздел вики описания опции демона также заявляет , что «Вы можете использовать демон благополучно в производственном режиме с runit / DaemonTools, однако вы не можете сделать изящное обновление.», Который я предполагаю , что имеет в виде модернизации на новый двоичный файл на особенность полета
Гэри
3

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

Nginx не порождает своего демона одним из двух способов, которые требует upstart, либо через «ожидаемую ветвь», либо «ожидаем демона», поэтому upstart не может отследить основной процесс nginx. Есть некоторые хаки, но у них есть свои проблемы.

Если вы согласны с тем, что upstart не может отследить главный процесс и завершить его при завершении работы, это будет работать:

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
danorton
источник
expect daemonвызывает зависание для меня upstart (Ubuntu 12.04, Upstart 1.5, Nginx). expect forkработал, хотя, как подсказывает @danorton, Upstart будет отслеживать неправильный PID. Я также не мог заставить респауна работать (см. Мой полный ответ).
PhilT
2

Существует пример конфигурационного файла Upstart в Nginx Wiki .

Возможно, вам придется настроить путь к двоичному файлу 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 stopnginx на самом деле не остановился. Я также заметил, что Upstart думал, что у процесса nginx есть PID, который на самом деле был PID одного из процессов Passenger. Очевидно, что NGINX / Passenger немного сбивает с толку Upstart.

ORJ
источник
Спасибо за этот сценарий для пассажира. Это, казалось, остановило процессы, но я получил stop: Job failed while stoppingпри этом. Ты это видел?
PhilT
У меня та же проблема, что и у @PhilT, есть что-нибудь об этом?
Клаудио Поли
0

Я использую:

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

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

Джим Митченер
источник
К сожалению, эта вики, похоже, подразумевает, что это всего лишь версия 0.5. Мне очень странно, что такое важное изменение задокументировано таким образом.
Чиггси
Что такое только версия 0.5?
Джим Митченер
Вики в общем. Справочные страницы в порядке, но они, конечно, не являются информационными страницами, которые, как правило, намного более подробны
Chiggsy
0

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

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

# 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

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

Клифф Стэнфорд
источник
Upstart в значительной степени мертвый продукт; Ubuntu - почти последний дистрибутив, использующий его. Все остальные отключаются или уже переключились.
Майкл Хэмптон
Даже сама Ubuntu перешла на systemd в более новых версиях. Но некоторые из нас, сисадминов, все еще привязаны к 14.04 из-за LTS.
Иван Анищук