Wie kann ich nginx per upstart starten?

9

Hintergrund:

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

Ich habe Nginx erstellt und möchte es mit upstart starten:

Nginx-Upstart-Skript von der Site:

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

Ich erhalte einen "unbekannten Job", wenn ich versuche, ihn mit initctl auszuführen. Was ich gerade erfahren habe, bedeutet anscheinend, dass ein Fehler vorliegt (was ist falsch an "Fehler", um Fehler zu beschreiben?)

Kann mich jemand in die richtige Richtung weisen? Ich habe die Dokumentation so wie sie ist gelesen und sie scheint für einen SysV-Init-Ersatz etwas spärlich zu sein ... aber was auch immer, um diesen Job zur Liste hinzuzufügen, auszuführen und mit den Überresten meines Lebens fortzufahren. .. Irgendwelche Tipps?

BEARBEITEN: initctl version init (upstart 0.6.5)

kichernd
quelle
1
Ein Kommentar zu 'unbekannter Job' vs 'Fehler'. Sie suchen nur am falschen Ort. Initctl liest die Konfigurationsdatei nicht, sondern fordert Upstart lediglich auf, einen bekannten Job zu laden - und upstart kennt diesen Job nicht, wenn Sie den Befehl initctl ausgeben. Der Fehler trat früher auf, als Upstart versuchte, die Jobdatei zu lesen. Es sollte eine Fehlermeldung im Systemprotokoll geben (/ var / log / syslog, / var / log / messages oder wo immer Ihr System diese Protokolle speichert)
Jacek Konieczny
Es stellt sich übrigens heraus, dass es in / sbin Start- und Stoppbefehle für Upstart-Jobs gibt. Sie haben für mich gearbeitet. Jetzt verlinken sie zurück zu initctl, daher bin ich mir nicht sicher, warum sie funktionieren, aber sie tun es.
Chiggsy

Antworten:

3

Sie können nicht mehrere stop onAnweisungen in einer Upstart-Jobbeschreibung für Upstart> = 0.5 haben.

Und console ownerist wahrscheinlich nicht das, was Sie wollen (dies macht nginx zum Besitzer der Systemkonsole).

Versuchen:

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
quelle
Leider immer noch unbekannter Job. Woher bekommen Sie diese Informationen? Mann? Die Info? online? Wo ist 0.6.5 dokumentiert?
Chiggsy
irgendwie funktioniert .. thnx
chiggsy
Ja, es ist schwierig, die aktuelle Upstart-Dokumentation zu finden, zumindest im Internet. Aber die Handbuchseite ist ziemlich gut. Versuchen Sie: man 5 init
Jacek Konieczny
1
Dies ist nicht der richtige Weg, um nginx auf Produktionsservern auszuführen. Die daemon offOption ist nur für die Entwicklung.
PhilT
16

Ich bin mehr als einmal hier gelandet und dachte, ich würde eine aktualisierte Antwort basierend auf meinen eigenen Erfahrungen geben, nachdem ich die Antworten hier verwendet habe. Vielen Dank insbesondere an @danorton und @orj für ihre Antworten.

Dieses Skript wurde unter Upstart 1.5 unter Ubuntu 12.04 mit Nginx 1.0.11 und Passenger 3.0.11 getestet. Wenn Sie Passenger nicht verwenden, müssen Sie möglicherweise mit der post-stopLinie herumspielen. Weitere Informationen finden Sie im Upstart-Kochbuch.

Fügen /etc/init/nginx.confSie in einem leeren Feld die folgenden Zeilen hinzu (Sie können die Kommentare entfernen, wenn Sie möchten):

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

Ich habe das Upstart-Skript aus dem Nginx-Wiki genommen und es optimiert, da einige Zeilen nicht benötigt werden, Verwirrung stiften oder nicht funktionieren.

Je nachdem, wo Sie nginx installiert haben und die PID schreiben, müssen Sie möglicherweise Änderungen env DAEMONund env PIDZeilen vornehmen. Die PID kann in Nginx konfiguriert werden.

Ich habe alle Formen von ausprobiert expect. Nur expect forkscheint zu funktionieren. Mit Passenger erstellt nginx 61 Gabeln. Upstart erfordert 0, 1 oder 2. Wie andere angedeutet haben, verfolgt Upstart die falsche PID. Ich habe auch entfernt, respawnda es wahrscheinlich aus dem gleichen Grund nichts tut. Einige zusätzliche Skripte vor / nach dem Start können dies möglicherweise beheben, indem sie die tatsächliche PID abrufen. Ich verwende jedoch monit, um Neustarts durchzuführen, brauche es also nicht.

Nicht verwenden daemon off. Dies ist nur für die Entwicklung. Siehe http://wiki.nginx.org/CoreModule#daemon

Verweise:

PhilT
quelle
1
Ich würde denken , dass Sie würde mit ausgeführt werden soll , daemon off;so dass Emporkömmling den richtigen Prozess / PID ohne die Notwendigkeit , dass die Uhren expect forkoder post-stopRichtlinien. Im Wiki-Abschnitt, in dem die Daemon-Option beschrieben wird, heißt es außerdem: "Sie können Daemon im Produktionsmodus mit runit / daemontools sicher ausschalten, jedoch kein ordnungsgemäßes Upgrade durchführen." Ich gehe davon aus, dass es sich um ein Upgrade auf eine neue Binärdatei auf dem Computer handelt Fliegenfunktion .
Gary
3

Das kannst du nicht. Zumindest nicht richtig.

Nginx erzeugt seinen Daemon nicht auf eine der beiden Arten, die ein Upstart erfordert, entweder über "Expect Fork" oder "Expect Daemon", sodass Upstart den Master-Nginx-Prozess nicht verfolgen kann. Es gibt einige Hacks, aber sie haben ihre eigenen Probleme.

Wenn Sie mit der Tatsache einverstanden sind, dass Upstart den Master-Prozess nicht verfolgen und beim Herunterfahren beenden kann, funktioniert dies:

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
quelle
expect daemonbewirkt, dass Upstart für mich hängen bleibt (Ubuntu 12.04, Upstart 1.5, Nginx). expect forkhat funktioniert, obwohl Upstart, wie @danorton andeutet, die falsche PID verfolgt. Ich konnte auch nicht wieder zur Arbeit kommen (siehe meine vollständige Antwort).
PhilT
2

Im NGINX-Wiki gibt es ein Beispiel für eine Upstart-Konfigurationsdatei .

Möglicherweise müssen Sie den Pfad zur Nginx-Binärdatei in der Konfigurationsdatei anpassen.

Diese Konfigurationsdatei funktioniert gut für mich mit Ubuntu 10.04 und Nginx 1.0.5.

Ich habe auch einen nginxSymlink beim /etc/init.dZeigen auf installiert, /lib/init/upstart-jobdamit ich den Standardbefehl servicezum Starten und Stoppen verwenden kann nginx.

Hinweis: Wenn Sie Phusion Passenger mit NGINX installieren, müssen Sie dem Upstart-Konfigurationsskript möglicherweise die folgende Zeilengruppe hinzufügen:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

Ich fand dies in meiner Ubuntu-Konfiguration notwendig. Ansonsten, als ich ausgegeben habe initctl stop nginxoder service nginx stopNginx nicht wirklich aufgehört hat. Ich bemerkte auch, dass Upstart dachte, der Nginx-Prozess hätte eine PID, die tatsächlich die PID eines der Passagierprozesse war. NGINX / Passenger verwirrt Upstart also eindeutig ein wenig.

orj
quelle
Danke für das Skript für den Passagier. Dies schien die Prozesse zu stoppen, aber ich bekam stop: Job failed while stoppingdabei. Hast du das gesehen?
PhilT
Ich habe das gleiche Problem wie @PhilT, ein Wort dazu?
Claudio Poli
0

Ich benutze:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

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

Das Anhalten runlevel [!...]scheint mehr Standard zu sein. Es ist das, was die Standard-SSH / Samba-Skripte tun. Sie sollten das respawnBit auch hinzufügen, damit es neu startet, wenn es stirbt. Ich bin mir auch nicht sicher, warum Sie wollen, console outputdass die Konsolenausgabe einfach an stdout gesendet wird. Das Standardverhalten besteht darin, einfach die Konsolenausgabe an den Logger zu senden.

Sie können alle Zeilengruppen- Dokumente im Upstart-Wiki anzeigen

Jim Mitchener
quelle
Leider scheint dieses Wiki zu implizieren, dass es sich nur um Version 0.5 handelt. Es ist sehr seltsam für mich, dass eine so wichtige Änderung auf diese Weise dokumentiert wird.
Chiggsy
Was ist nur Version 0.5?
Jim Mitchener
Das Wiki im Allgemeinen. Die Manpages sind in Ordnung, aber es handelt sich sicher nicht um Infoseiten, die normalerweise viel detaillierter sind.
Chiggsy
0

Seltsamerweise funktioniert keine der Antworten hier tatsächlich vollständig, da sie den Start in einem Stopp- / Abbruchzustand belassen, der verhindert, dass ein anderer anfängt zu arbeiten. Dies bedeutet, dass dies restart nginxfehlschlägt.

Der Fehler mit Upstart ist unter https://bugs.launchpad.net/upstart/+bug/406397 gut dokumentiert, und ich bin erstaunt, dass es dem Autor von Upstart nicht wichtig genug zu sein scheint, ihn zu beheben. Die einzige Lösung, die ich gesehen habe, die funktioniert, ist die folgende (aus demselben Fehlerbericht gestohlen):

# 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

Der Vorteil, es so zu schreiben, ist, dass sogar der Respawn funktioniert. Der Nachteil ist, dass es hässlich und ein böser Hack ist.

Cliff Stanford
quelle
Upstart ist so ziemlich ein totes Produkt; Ubuntu ist fast die letzte Distribution, die es verwendet. Alle anderen schalten weg oder haben bereits gewechselt.
Michael Hampton
Sogar Ubuntu selbst hat in neueren Versionen auf systemd umgestellt. Aber einige von uns Sysadmins stecken immer noch am 14.04 fest, weil LTS.
Ivan Anishchuk