Comment puis-je démarrer nginx via upstart?

9

Contexte:

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

J'ai construit nginx, et j'aimerais utiliser upstart pour le démarrer:

Script de démarrage nginx à partir du 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

J'obtiens un "travail inconnu" lorsque j'essaie d'utiliser initctl pour l'exécuter, ce que je viens d'apprendre apparemment signifie qu'il y a une erreur, (qu'est-ce qui ne va pas avec "Error" pour décrire les erreurs?)

Quelqu'un peut me diriger dans la bonne direction ? J'ai lu la documentation, telle qu'elle est, et cela semble un peu rare pour un remplacement d'initialisation SysV ... mais quoi que ce soit, il suffit d'ajouter ce travail à la liste, de l'exécuter et de continuer avec ce qui reste de ma vie. .. Des conseils?

EDIT: initctl version init (upstart 0.6.5)

chiggsy
la source
1
Un commentaire sur 'travail inconnu' contre 'Erreur'. Vous cherchez juste au mauvais endroit. Initctl ne lit pas le fichier de configuration, il demande simplement à Upstart de charger un travail connu - et upstart ne connaît pas ce travail lorsque vous émettez la commande initctl. Une erreur s'est produite plus tôt lorsque Upstart a tenté de lire le fichier de travail. Il devrait y avoir un message d'erreur dans le journal système (/ var / log / syslog, / var / log / messages ou partout où votre système stocke ces journaux)
Jacek Konieczny
Soit dit en passant, il s'avère que dans / sbin, il existe des commandes de démarrage et d'arrêt pour les travaux parvenus. Ils ont travaillé pour moi. Maintenant, ils sont liés à initctl, donc je ne sais pas pourquoi ils fonctionnent, mais ils le font.
chiggsy

Réponses:

3

Vous ne pouvez pas avoir plusieurs stop ondirectives dans une description de tâche upstart pour Upstart> = 0.5.

Et ce console ownern'est probablement pas ce que vous voulez (cela fait de nginx le propriétaire de la console système).

Essayer:

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
la source
Travail encore inconnu, hélas. D'où obtenez-vous ces informations? Homme? Info? en ligne? Où la version 0.6.5 est-elle documentée?
chiggsy
un peu travaillé .. thnx
chiggsy
Oui, il est difficile de trouver la documentation Upstart actuelle, du moins sur le Web. Mais la page de manuel est assez bonne. Essayez: man 5 init
Jacek Konieczny
1
Ce n'est pas la bonne façon d'exécuter nginx sur des serveurs de production. L' daemon offoption est pour le développement uniquement.
PhilT
16

Je me suis retrouvé ici plus d'une fois, alors j'ai pensé fournir une réponse mise à jour basée sur ma propre expérience après avoir utilisé les réponses ici. Merci particulièrement à @danorton et @orj pour leurs réponses.

Ce script a été testé sur Upstart 1.5 exécuté sur Ubuntu 12.04 avec Nginx 1.0.11 et Passenger 3.0.11. Si vous n'utilisez pas Passenger, vous devrez peut-être jouer avec la post-stopligne. Reportez-vous au livre de recettes Upstart.

Dans un espace vide, /etc/init/nginx.confajoutez les lignes suivantes (vous pouvez supprimer les commentaires si vous le souhaitez):

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

J'ai pris le script Upstart du wiki Nginx et l'ai modifié car un certain nombre de lignes ne sont pas nécessaires, provoquent de la confusion ou ne fonctionnent pas.

Vous devrez peut-être modifier env DAEMONet env PIDlignes en fonction de l'endroit où vous avez installé nginx et écrivez le PID. Le PID peut être configuré dans nginx.

J'ai essayé toutes les formes de expect. expect forkSemble seulement fonctionner. Avec Passenger, nginx crée 61 fourches. Upstart nécessite 0, 1 ou 2. Comme d'autres l'ont laissé entendre, Upstart suivra le mauvais PID. J'ai également supprimé respawncar il ne fait probablement rien pour la même raison. Certains scripts supplémentaires avant / après démarrage peuvent résoudre ce problème en saisissant le vrai PID. Cependant, j'utilise monit pour gérer les redémarrages, donc je n'en ai pas besoin.

Ne pas utiliser daemon off. C'est uniquement pour le développement. Voir http://wiki.nginx.org/CoreModule#daemon

Références:

PhilT
la source
1
Je pense que vous auriez envie de courir à l' aide de daemon off;sorte que le processus arriviste montres correct / PID sans qu'il soit nécessaire pour le expect forkou les post-stopdirectives. La section wiki décrivant l'option démon indique également "Vous pouvez utiliser le démon en toute sécurité en mode production avec runit / daemontools, mais vous ne pouvez pas faire une mise à niveau gracieuse.", Qui je suppose fait référence à la mise à niveau vers un nouveau binaire sur le fonction de vol .
Gary
3

Tu ne peux pas. Du moins pas correctement, de toute façon.

Nginx ne génère pas son démon de l'une des deux manières requises par upstart, soit via «expect fork» ou «expect daemon», donc upstart ne peut pas suivre le processus maître nginx. Il y a des hacks, mais ils ont leurs propres problèmes.

Si vous êtes d'accord avec le fait que upstart ne peut pas suivre le processus maître et le tuer à l'arrêt, cela fonctionnera:

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
la source
expect daemonprovoque un blocage pour moi (Ubuntu 12.04, Upstart 1.5, Nginx). expect forka fonctionné bien que comme l'indique @danorton, Upstart suivra le mauvais PID. Je ne pouvais pas non plus faire réapparaître pour travailler (voir ma réponse complète).
PhilT
2

Il y a un exemple de fichier de configuration Upstart dans le Wiki NGINX .

Vous devrez peut-être ajuster le chemin vers le binaire nginx dans le fichier de configuration.

Ce fichier de configuration fonctionne bien pour moi avec Ubuntu 10.04 et nginx 1.0.5.

J'ai également installé un nginxlien symbolique en /etc/init.dpointant sur /lib/init/upstart-jobafin que je puisse utiliser la servicecommande standard pour démarrer et arrêter nginx.

Remarque: Si vous installez Phusion Passenger avec NGINX, vous devrez peut-être ajouter la strophe suivante au script de configuration 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

J'ai trouvé cela nécessaire sur ma configuration Ubuntu. Sinon, quand j'ai émis initctl stop nginxou que service nginx stopnginx ne s'est pas réellement arrêté. J'ai également remarqué que Upstart pensait que le processus nginx avait un PID qui était en fait le PID de l'un des processus passagers. Il est donc clair que NGINX / Passenger confond un peu Upstart.

orj
la source
Merci pour ce script pour le passager. Cela a semblé arrêter les processus, mais j'ai réussi à le stop: Job failed while stoppingfaire. As-tu vu ça?
PhilT
J'ai le même problème que @PhilT, un mot à ce sujet?
Claudio Poli
0

J'utilise:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

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

L'arrêt runlevel [!...]semble être plus standard. C'est ce que font les scripts stock ssh / samba. Vous devez également ajouter le respawnbit afin qu'il redémarre s'il meurt. Je ne sais pas non plus pourquoi vous voulez console outputque cela envoie simplement la sortie de la console à stdout. Le comportement par défaut consiste à envoyer simplement la sortie de la console à l'enregistreur.

Vous pouvez voir tous les documents de la strophe sur le wiki Upstart

Jim Mitchener
la source
Malheureusement, ce wiki semble impliquer qu'il ne s'agit que de la version 0.5. Il est très étrange pour moi qu'un changement aussi important soit documenté de cette façon.
chiggsy
Qu'est-ce que la version 0.5?
Jim Mitchener
Le wiki en général. Les pages de manuel sont correctes, mais elles ne sont certainement pas des pages «info», qui sont généralement beaucoup plus détaillées.
chiggsy
0

Étrangement, aucune des réponses ici ne fonctionne réellement pleinement car elles laissent le début dans un état d'arrêt / d'arrêt, ce qui empêche un autre démarrage de fonctionner. Cela signifie que cela restart nginxéchoue.

Le bogue avec upstart est bien documenté à https://bugs.launchpad.net/upstart/+bug/406397 et je suis étonné que l'auteur de upstart ne semble pas assez se soucier de le corriger. La seule solution que j'ai vue qui fonctionne est la suivante (volée dans le même rapport de bogue):

# 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

L'avantage de l'écrire comme ceci est que même la réapparition fonctionne. L'inconvénient est que c'est moche et un hack méchant.

Cliff Stanford
la source
Upstart est à peu près un produit mort; Ubuntu est presque la dernière distribution qui l'utilise. Tous les autres partent ou ont déjà changé.
Michael Hampton
Même Ubuntu lui-même est passé à systemd dans les versions plus récentes. Mais certains d'entre nous sont toujours bloqués avec 14.04 parce que LTS.
Ivan Anishchuk