Come posso avviare nginx tramite upstart?


9

Sfondo:

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

Ho creato nginx e mi piacerebbe usare upstart per avviarlo:

nginx upstart script dal sito:

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

Ottengo un "lavoro sconosciuto" quando provo a utilizzare initctl per eseguirlo, che ho appena appreso significa che c'è un errore (cosa c'è di sbagliato in "Errore" per descrivere gli errori?)

Qualcuno può indicarmi la giusta direzione? Ho letto la documentazione così com'è e sembra un po 'scarna per una sostituzione di init SysV ... ma qualunque cosa abbia solo bisogno di aggiungere questo lavoro all'elenco, eseguirlo e andare avanti con ciò che resta della mia vita. .. Qualche consiglio?

EDIT: initctl versione init (upstart 0.6.5)


1
Un commento su "lavoro sconosciuto" vs "Errore". Stai solo guardando nel posto sbagliato. Initctl non legge il file di configurazione, chiede solo a Upstart di caricare un lavoro noto - e upstart non conosce questo lavoro quando si emette il comando initctl. Si è verificato un errore in precedenza quando Upstart ha tentato di leggere il file di lavoro. Dovrebbe esserci un messaggio di errore nel registro di sistema (/ var / log / syslog, / var / log / messages o ovunque il sistema memorizzi questi registri)
Jacek Konieczny

A proposito, si scopre che in / sbin ci sono comandi di avvio e arresto per i lavori di avvio. Hanno lavorato per me. Ora si collegano a initctl, quindi non sono sicuro del motivo per cui funzionano, ma lo fanno.
Chiggsy,

Risposte:


3

Non è possibile avere più stop ondirettive in una descrizione del processo di avvio per Upstart> = 0,5.

E console ownerprobabilmente non è quello che vuoi (questo rende nginx il proprietario della console di sistema).

Provare:

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

Lavoro ancora sconosciuto, ahimè. Da dove stai ottenendo queste informazioni? Uomo? Informazioni? in linea? Dove è 0.6.5 documentato?
Chiggsy,

un po 'ha funzionato .. grazie
Chiggsy

Sì, è difficile trovare la documentazione attuale di Upstart, almeno sul web. Ma la pagina del manuale è abbastanza buona. Prova: man 5 init
Jacek Konieczny

1
Questo non è il modo giusto per eseguire nginx sui server di produzione. L' daemon offopzione è solo per lo sviluppo.
PhilT,

16

Sono finito qui più di una volta, quindi ho pensato di fornire una risposta aggiornata in base alla mia esperienza personale dopo aver utilizzato le risposte qui. Grazie soprattutto a @danorton e @orj per le loro risposte.

Questo script è stato testato su Upstart 1.5 in esecuzione su Ubuntu 12.04 con Nginx 1.0.11 e Passenger 3.0.11. Se non stai utilizzando Passenger, potresti dover giocare con la post-stoplinea. Consultare il libro di cucina Upstart.

In un vuoto /etc/init/nginx.confaggiungi le seguenti righe (puoi rimuovere i commenti se vuoi):

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

Ho preso lo script Upstart dal Wiki di Nginx e l'ho modificato in quanto un numero di righe non sono necessarie, causano confusione o non funzionano.

Potrebbe essere necessario modificare env DAEMONe le env PIDlinee a seconda di dove hai installato nginx e stai scrivendo il PID. Il PID può essere configurato in nginx.

Ho provato tutte le forme di expect. expect forkSembra solo funzionare. Con Passenger nginx crea 61 forchette. Upstart richiede 0, 1 o 2. Come altri hanno suggerito, Upstart seguirà il PID errato. Ho anche rimosso respawnin quanto probabilmente non fa nulla per lo stesso motivo. Alcuni script pre / post avvio aggiuntivi potrebbero essere in grado di risolverlo afferrando il vero PID. Tuttavia, utilizzo Monit per gestire i riavvii, quindi non ne ho bisogno.

Non usare daemon off. Questo è solo per lo sviluppo. Vedi http://wiki.nginx.org/CoreModule#daemon

Riferimenti:


1
Vorrei pensare che si sarebbe voler eseguire utilizzando daemon off;in modo che upstart orologi il processo corretto / PID, senza la necessità per l' expect forko post-stopdirettive. La sezione wiki che descrive l'opzione demone afferma anche "Puoi usare il demone in modo sicuro in modalità di produzione con runit / daemontools, tuttavia non puoi fare un aggiornamento grazioso", che presumo si riferisca all'aggiornamento a un nuovo binario sul funzione di volo .
Gary

3

Non puoi. Almeno non correttamente, comunque.

Nginx non genera il suo demone in uno dei due modi richiesti da upstart, né tramite "prevede fork" o "prevede daemon", quindi upstart non è in grado di tracciare il processo master nginx. Ci sono alcuni hack, ma hanno i loro problemi.

Se stai bene con il fatto che upstart non può tenere traccia del processo principale e ucciderlo allo spegnimento, questo funzionerà:

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 daemonfa impiccare upstart per me (Ubuntu 12.04, Upstart 1.5, Nginx). expect forkha funzionato sebbene, come suggerito da @danorton, Upstart seguirà il PID sbagliato. Inoltre non sono riuscito a far funzionare nuovamente la rigenerazione (vedi la mia risposta completa).
PhilT,

2

C'è un esempio di file di configurazione Upstart nel Wiki di NGINX .

Potrebbe essere necessario regolare il percorso del binario nginx nel file di configurazione.

Questo file di configurazione funziona perfettamente con Ubuntu 10.04 e nginx 1.0.5.

Ho anche installato un nginxlink simbolico in /etc/init.dindicando /lib/init/upstart-jobcosì ho potuto utilizzare lo standard servicedi comando per avviare e interrompere nginx.

Nota: se si installa Phusion Passenger con NGINX, potrebbe essere necessario aggiungere la seguente stanza allo script di configurazione di 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

Ho trovato questo necessario sulla mia configurazione di Ubuntu. Altrimenti quando ho emesso initctl stop nginxo service nginx stopnginx non si è effettivamente fermato. Ho anche notato che Upstart pensava che il processo nginx avesse un PID che era in realtà il PID di uno dei processi Passeggero. Quindi chiaramente NGINX / Passenger sta confondendo un po 'Upstart.


Grazie per quella sceneggiatura per passeggero. Questo sembrava fermare i processi ma ci sono riuscito stop: Job failed while stopping. L'hai visto?
PhilT

Ho lo stesso problema di @PhilT, qualche parola su questo?
Claudio Poli,

0

Io uso:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

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

La fermata runlevel [!...]sembra essere più standard. È ciò che fanno gli script stock ssh / samba. Dovresti anche aggiungere il respawnbit in modo che si riavvii se muore. Inoltre non sono sicuro del motivo per cui vuoi console outputsemplicemente inviare l'output della console a stdout. Il comportamento predefinito è semplicemente inviare l'output della console al logger.

Puoi vedere tutti i documenti della stanza sul wiki di Upstart


Sfortunatamente, quel wiki sembra implicare che è solo la versione 0.5. È molto strano per me che un cambiamento così importante sia documentato in quel modo.
Chiggsy,

Che cos'è solo la versione 0.5?
Jim Mitchener,

Il wiki in generale. Le pagine man sono ok, ma sicuramente non sono pagine 'info', che di solito sono molto più dettagliate.
Chiggsy,


0

Stranamente nessuna delle risposte qui funziona in realtà completamente mentre lasciano in uno stato di stop / kill che impedisce a un altro di iniziare a lavorare. Questo significa che restart nginxfallisce.

Il bug con upstart è ben documentato su https://bugs.launchpad.net/upstart/+bug/406397 e sono sorpreso che l'autore di upstart non sembri preoccuparsi abbastanza per risolverlo. L'unica soluzione che ho visto che funziona è la seguente (rubata dalla stessa segnalazione di bug):

# 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

Il vantaggio di scriverlo in questo modo è che anche il respawn funziona. Lo svantaggio è che è brutto e un brutto trucco.


Upstart è praticamente un prodotto morto; Ubuntu è quasi l'ultima distribuzione che lo utilizza. Tutti gli altri si stanno allontanando o sono già passati.
Michael Hampton,

Anche Ubuntu stesso è passato a systemd nelle versioni più recenti. Ma alcuni di noi amministratori di sistema sono ancora bloccati con 14.04 a causa di LTS.
Ivan Anishchuk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.