Як я можу запустити nginx за допомогою запуску?


9

Фон:

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 ... але все, що просто потрібно, щоб додати цю роботу до списку, запустити її та займатись тим, що залишилося від мого життя. .. Будь-які поради?

EDIT: версія initctl init (upstart 0.6.5)


1
Один коментар про "невідому роботу" проти "Помилка". Ви просто дивитесь у неправильному місці. Initctl не читає конфігураційний файл, він просто просить Upstart завантажити відому роботу - і upstart не знає цієї роботи при видачі команди initctl. Помилка сталася раніше, коли Upstart намагався прочитати файл завдання. У системному журналі (/ var / log / syslog, / var / log / messages або там, де ваша система зберігає ці журнали) повинно бути повідомлення про помилку
Jacek Konieczny

До речі, виявляється, що в / sbin є команди start і stop для початкових завдань. Вони працювали на мене. Тепер вони посилаються на 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?
chiggsy

щось спрацювало .. thnx
chiggsy

Так, важко знайти поточну документацію Upstart, принаймні в Інтернеті. Але сторінка з керівництвом досить гарна. Спробуйте: man 5 init
Jacek Konieczny

1
Це не правильний спосіб запуску nginx на виробничих серверах. Цей daemon offваріант призначений лише для розвитку.
PhilT

16

Тут я не раз потрапляв, тому думав, що після використання відповідей тут я отримаю оновлену відповідь на основі власного досвіду. Особливо дякую @danorton та @orj за відповіді.

Цей сценарій був протестований на Upstart 1.5, який працює на Ubuntu 12.04 з Nginx 1.0.11 та Passenger 3.0.11. Якщо ви не використовуєте Пасажира, можливо, вам доведеться пограти з 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здається, працює. За допомогою пасажира nginx створює 61 вилку. Для запуску потрібні 0, 1 або 2. Як натякнули інші, Upstart буде відслідковувати неправильний PID. Я також видалив, respawnоскільки він нічого не робить, ймовірно, з тієї ж причини. Деякі додаткові сценарії до / після запуску, можливо, зможуть це виправити, захопивши реальний PID. Я, однак, використовую monit для обробки перезавантажень, тому це не потрібно.

Не використовуйте daemon off. Це лише для розвитку. Дивіться http://wiki.nginx.org/CoreModule#daemon

Список літератури:


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

3

Ви не можете. Принаймні, не належним чином, все одно.

Nginx не породжує свого демона одним із двох способів, необхідних для запуску, або через "очікувати вилку", або "очікувати демона", тому upstart не в змозі відстежувати процес 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

expect daemonвикликає звисання для мене запуску (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 одного з пасажирських процесів. Так чітко NGINX / Пасажир трохи заплутує Upstart.


Дякуємо за цей сценарій для пасажирів. Це, здавалося, зупиняло процеси, але я це 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що це просто надсилає консольний вихід у stdout. За замовчуванням поведінка полягає у тому, щоб просто надіслати вихідний консоль реєстратору.

Ви можете побачити всі документи строфи на вікі Upstart


На жаль, ця вікі, мабуть, означає, що це лише версія 0.5. Мені дуже дивно, що така важлива зміна задокументована таким чином.
chiggsy

Що таке лише версія 0,5?
Джим Мітченер

Вікі взагалі. Сторінки з чоловіком все в порядку, але вони впевнені, що це не "інформаційні" сторінки, які зазвичай набагато детальніше.
chiggsy


0

Як не дивно, жодна з відповідей тут насправді не працює повноцінно, оскільки вони залишають старт у зупиненому / вбитому стані, що заважає іншому почати працювати. Це означає, що 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

Перевага написання цього тексту полягає в тому, що навіть відродження працює. Недоліком є ​​те, що це некрасиво і неприємно зламати.


Upstart - це майже мертвий продукт; Ubuntu майже майже останній дистрибутив, який використовує його. Усі інші вимикаються або вже переключились.
Майкл Хемптон

Навіть сам Ubuntu перейшов на systemd у новіших версіях. Але деякі з нас сисадміни все ще затримуються з 14.04 через LTS.
Іван Аніщук
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.