Jak mogę uruchomić Nginx poprzez Upstart?

9

Tło:

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

Zbudowałem nginx i chciałbym użyć Upstart, aby go uruchomić:

Skrypt startowy nginx ze strony:

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

Dostaję „nieznane zadanie”, gdy próbuję użyć initctl do uruchomienia go, co właśnie dowiedziałem się, że najwyraźniej oznacza błąd (co jest nie tak z „Błąd”, aby opisać błędy?)

Czy ktoś może skierować mnie we właściwym kierunku? Przeczytałem taką dokumentację i wydaje się to trochę rzadkie w przypadku zamiany init SysV ... ale cokolwiek po prostu trzeba dodać tę pracę do listy, uruchomić ją i zająć się tym, co zostało z mojego życia. .. Jakieś wskazówki?

EDYCJA: initctl wersja init (upstart 0.6.5)

chiggsy
źródło
1
Jeden komentarz na temat „nieznanej pracy” vs „Błąd”. Po prostu patrzysz w niewłaściwe miejsce. Initctl nie odczytuje pliku konfiguracyjnego, po prostu prosi Upstart o załadowanie znanego zadania - a upstart nie zna tego zadania po wydaniu polecenia initctl. Błąd wystąpił wcześniej, gdy Upstart próbował odczytać plik zadania. W dzienniku systemowym powinien pojawić się komunikat o błędzie (/ var / log / syslog, / var / log / messages lub wszędzie tam, gdzie system zapisuje te logi)
Jacek Konieczny
Nawiasem mówiąc, okazuje się, że w / sbin są komendy start i stop dla zadań upstart. Pracowali dla mnie. Teraz łączą się z powrotem z initctl, więc nie jestem pewien, dlaczego działają, ale działają.
chiggsy 18.10.10

Odpowiedzi:

3

Nie można mieć wielu stop ondyrektyw w opisie zadania upstart dla Upstart> = 0,5.

I console ownerprawdopodobnie nie jest to, czego chcesz (to sprawia, że ​​Nginx jest właścicielem konsoli systemowej).

Próbować:

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
Jacek Konieczny
źródło
Niestety, wciąż nieznana praca. Skąd czerpiesz te informacje? Mężczyzna? Info? online? Gdzie jest udokumentowane 0.6.5?
chiggsy
trochę pracowało .. thnx
chiggsy
Tak, trudno jest znaleźć aktualną dokumentację Upstart, przynajmniej w Internecie. Ale strona podręcznika jest całkiem dobra. Spróbuj: man 5 init
Jacek Konieczny
1
To nie jest właściwy sposób uruchamiania nginx na serwerach produkcyjnych. Ta daemon offopcja jest przeznaczona tylko dla programistów.
PhilT
16

Skończyłem tu więcej niż raz, więc pomyślałem, że po skorzystaniu z tych odpowiedzi przedstawię zaktualizowaną odpowiedź na podstawie własnego doświadczenia. Dzięki szczególnie dla @danorton i @orj za odpowiedzi.

Ten skrypt został przetestowany na Upstart 1.5 działającym na Ubuntu 12.04 z Nginx 1.0.11 i Passenger 3.0.11. Jeśli nie używasz Pasażera, być może będziesz musiał pobawić się post-stoplinią. Patrz książka kucharska Upstart.

/etc/init/nginx.confDodaj puste wiersze (możesz usunąć komentarze, jeśli chcesz):

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

Wziąłem skrypt Upstart z Wiki Nginx i poprawiłem go, ponieważ wiele linii nie jest potrzebnych, powoduje zamieszanie lub nie działa.

Może zajść potrzeba zmiany env DAEMONi env PIDlinii w zależności od tego, gdzie zainstalowałeś nginx i zapisujesz PID. PID można skonfigurować w nginx.

Próbowałem wszystkich form expect. Tylko expect forkwydaje się działać. Z Passenger nginx tworzy 61 widelców. Upstart wymaga 0, 1 lub 2. Jak sugerowali inni, Upstart będzie śledził zły PID. Usunąłem również, respawnponieważ prawdopodobnie nie robi nic z tego samego powodu. Niektóre dodatkowe skrypty przed / po uruchomieniu mogą to naprawić, chwytając prawdziwy PID. Ja jednak używam monitora do obsługi restartów, więc nie potrzebuję tego.

Nie używać daemon off. To jest tylko dla rozwoju. Zobacz http://wiki.nginx.org/CoreModule#daemon

Bibliografia:

PhilT
źródło
1
Myślę, że będzie chciał uruchomić za pomocą daemon off;tak że dorobkiewicz zegarki prawidłowego procesu / PID bez potrzeby zapewnienia expect forklub post-stopdyrektyw. Sekcja wiki opisująca opcję demona mówi także: „Możesz bezpiecznie wyłączyć demona w trybie produkcyjnym z runit / daemontools, jednak nie możesz wykonać płynnego uaktualnienia.”, Który, jak zakładam, odnosi się do uaktualnienia do nowego pliku binarnego na funkcja latania .
Gary,
3

Nie możesz W każdym razie przynajmniej niewłaściwie.

Nginx nie odradza swojego demona na jeden z dwóch sposobów wymaganych przez upstart, albo poprzez „expect fork” lub „expect demon”, więc upstart nie jest w stanie śledzić głównego procesu nginx. Jest kilka hacków, ale mają swoje własne problemy.

Jeśli nie masz nic przeciwko temu, że upstart nie może śledzić procesu głównego i zabić go podczas zamykania, zadziała to:

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
źródło
expect daemonpowoduje, że upstart zawiesił się dla mnie (Ubuntu 12.04, Upstart 1.5, Nginx). expect forkdziałało, chociaż jak wskazuje @danorton, Upstart będzie śledził zły PID. Nie mogłem też odrodzić się do pracy (zobacz moją pełną odpowiedź).
PhilT
2

Jest to przykładowy plik konfiguracyjny Upstart w nginx Wiki .

Konieczne może być dostosowanie ścieżki do pliku binarnego nginx w pliku konfiguracyjnym.

Ten plik konfiguracyjny działa dobrze dla mnie z Ubuntu 10.04 i nginx 1.0.5.

Zainstalowałem również nginxdowiązanie symboliczne /etc/init.dwskazujące na, /lib/init/upstart-jobaby móc używać standardowego servicepolecenia do uruchamiania i zatrzymywania nginx.

Uwaga: Jeśli zainstalujesz Phusion Passenger z NGINX, może być konieczne dodanie następującej zwrotki do skryptu konfiguracyjnego 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

Uważam to za konieczne w mojej konfiguracji Ubuntu. W przeciwnym razie, kiedy wydałem initctl stop nginxlub service nginx stopnginx tak naprawdę nie przestał. Zauważyłem również, że Upstart myślał, że proces nginx ma PID, który w rzeczywistości jest PID jednego z procesów Pasażera. Widać więc wyraźnie, że NGINX / Passenger nieco myli Upstart.

orj
źródło
Dzięki za skrypt dla pasażera. Wydawało się, że to zatrzymało procesy, ale ja to zrobiłem stop: Job failed while stopping. Widziałeś to?
PhilT
Mam taki sam problem jak @PhilT, jakieś słowo na ten temat?
Claudio Poli,
0

Używam:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

Zatrzymanie runlevel [!...]wydaje się bardziej standardowe. To właśnie robią standardowe skrypty ssh / samba. Powinieneś także dodać respawnbit, aby wznowił działanie po śmierci. Nie jestem również pewien, dlaczego chcesz, console outputaby po prostu wysyłało wyjście konsoli na standardowe wyjście. Domyślnym zachowaniem jest po prostu wysyłanie danych wyjściowych konsoli do programu rejestrującego.

Możesz zobaczyć wszystkie dokumenty ze strofa na wiki Upstart

Jim Mitchener
źródło
Niestety, ta wiki wydaje się sugerować, że jest to tylko wersja 0.5. To dla mnie bardzo dziwne, że tak ważna zmiana jest udokumentowana w ten sposób.
chiggsy
Co to jest tylko wersja 0.5?
Jim Mitchener,
Wiki w ogóle. Strony podręcznika są w porządku, ale z pewnością nie są stronami „informacyjnymi”, które zwykle są znacznie bardziej szczegółowe.
chiggsy 18.10.10
0

Co dziwne, żadna z odpowiedzi tutaj nie działa w pełni, ponieważ zostawiają start w stanie zatrzymania / zabicia, co uniemożliwia kolejne rozpoczęcie działania. Oznacza to, że restart nginxzawodzi.

Błąd związany z upstartem jest dobrze udokumentowany na https://bugs.launchpad.net/upstart/+bug/406397 i jestem zaskoczony, że autor upstartu nie wydaje się wystarczająco zainteresowany, aby go naprawić. Jedyne rozwiązanie, które widziałem, które działa, jest następujące (skradzione z tego samego zgłoszenia błędu):

# 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

Zaletą pisania w ten sposób jest to, że działa nawet odrodzenie. Wadą jest to, że jest brzydki i nieprzyjemny hack.

Cliff Stanford
źródło
Upstart jest właściwie martwym produktem; Ubuntu to prawie ostatnia dystrybucja, która go używa. Wszystkie pozostałe się zmieniają lub już się zmieniły.
Michael Hampton
Nawet sam Ubuntu przeszedł na systemd w nowszych wersjach. Ale niektórzy z nas sysadmini wciąż utknęli z 14.04, ponieważ LTS.
Ivan Anishchuk