Comment redémarrer nginx uniquement après que le test de configuration a réussi sur Ubuntu?

111

Lorsque je redémarre le service nginx sur une ligne de commande sur un serveur Ubuntu, le service se bloque lorsqu'un fichier de configuration nginx contient des erreurs. Sur un serveur multi-sites, cela met hors service tous les sites, même ceux sans erreur de configuration.

Pour éviter cela, j'exécute d'abord le test de configuration nginx:

nginx -t

Une fois le test réussi, je pourrais redémarrer le service:

/etc/init.d/nginx restart

Ou rechargez uniquement les configurations du site nignx sans redémarrage:

nginx -s reload

Existe-t-il un moyen de combiner ces deux commandes où la commande de redémarrage est conditionnelle au résultat du test de configuration?

Je n'ai pas trouvé cela en ligne et la documentation officielle à ce sujet est plutôt basique. Je ne connais pas très bien Linux, donc je ne sais pas si ce que je cherche est juste devant moi ou pas du tout possible.

J'utilise nginx v1.1.19.

Jan
la source
Qu'en est-il d'un petit script shell qui vérifie l'état de retour de nginx -t (avec $?), Puis redémarre en fonction de l'état de retour?
TeTeT

Réponses:

49

En fait, pour autant que je sache, nginx afficherait un message vide et ne redémarrerait pas si la configuration est mauvaise.

La seule façon de tout gâcher est de faire un arrêt nginx, puis de recommencer. Il réussirait à s'arrêter, mais échouerait à démarrer.

Mohammad AbuShady
la source
1
De quelle version de nginx parlez-vous? Je travaille avec la version 1.1.19 et il essaiera de redémarrer quelles que soient les erreurs dans les fichiers de configuration. Il me informe qu'il ya un problème, mais il est déjà trop tard
janvier
5
Ok, je viens de le tester, mon ordinateur portable a nginx 1.2 et cela a fonctionné comme je l'ai décrit, mon VPS a 1.1.19 comme le vôtre, et il a fait la même chose que vous avez décrit dans votre question. Donc je suppose que cela a été traité en 1.2
Mohammad AbuShady
Génial! Merci d'avoir compris cela pour moi. Je vais garder la question ouverte un peu plus longtemps pour voir si personne n'a de réponse pour nginx <v1.2
jan
1
Je suppose que je vais devoir mettre à jour alors :-) besoin d' une excuse de toute façon
janvier
1
service nginx reloadne montre rien si la configuration a été chargée correctement ou non, il est donc inutile si vous pensez que la configuration est peut-être incorrecte. service nginx restartarrêtera le serveur si la configuration a une erreur!
Dan Dascalescu
80

À partir de nginx 1.8.0, la solution correcte est

sudo nginx -t && sudo service nginx reload

Notez qu'en raison d'un bogue, configtestrenvoie toujours un code de sortie nul même si le fichier de configuration contient une erreur.

Dan Dascalescu
la source
3
nginx -t && sudo nginx -s reload
MechanisM
5
@MechanisM: nginx -tsans sudo échouera presque certainement en raison d'erreurs d'autorisation.
Dan Dascalescu
Je voulais surtout montrer la dernière partie pour le rechargement. Dans mon cas, j'ai compilé nginx personnalisé et je n'ai même pas de script dans /etc/init.d et ainsi de suite, donc dans mon cas, "service nginx reload" ne fera rien
MechanisM
39

J'utilise la commande suivante pour recharger Nginx (version 1.5.9) uniquement si un test de configuration a réussi:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Si vous devez le faire souvent, vous pouvez utiliser un alias. J'utilise ce qui suit:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

L'astuce ici est effectuée par le "&&" qui n'exécute la deuxième commande que si la première a réussi. Vous pouvez voir ici une explication plus détaillée de l'utilisation de l'opérateur "&&".

Vous pouvez utiliser "redémarrer" au lieu de "recharger" si vous voulez vraiment redémarrer le serveur.

Mauricio Sánchez
la source
Méfiez-vous de nginx 1.4.2 que j'ai trouvé pkill -1 nginx(effectivement ce que fait mon rechargement init.d / nginx) ne se recharge PAS si la configuration échoue et renvoie un succès trompeur. Vérifiez vos propres versions.
KCD
2
Cela ne fonctionne pas pour moi. Les deux commandes sont exécutées même si le test échoue.
Mario Campa
2
configtest renvoie toujours un code de sortie nul , au moins dans nginx 1.8.0. Utilisez nginx -tplutôt.
Dan Dascalescu
8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

puis utilisez les commandes "nginx.reload" etc.

Mécanisme
la source
6

Vous pouvez recharger en utilisant /etc/init.d/nginx reload etsudo service nginx reload

Si nginx -t jette une erreur, il ne se rechargera pas

alors utilisez && pour exécuter les deux en même temps

comme

nginx -t && /etc/init.d/nginx recharger

gokul kandasamy
la source
Laissez-moi vous apprendre quelque chose à propos de bash. && ne fonctionne pas run both at a same timeElle exécute la commande sur la droite SI la commande sur la gauche renvoie un code de sortie de 0. Si vous nginx -tlancez une erreur, le code de sortie ne sera pas 0, donc la deuxième commande ne sera pas exécutée. C'est nginx -s reloadquand même
miknik
@miknik Je pense que c'est ce qu'il voulait dire, ça ne s'est pas bien passé. Dit-il If nginx -t throws some error then it won't reload. L'instruction run both at a same timepeut également être interprétée comme une seule commande ou une ligne. Je ne l'interprète pas nécessairement en disant dans ce cas in parallel.
matt
2

Vous pouvez utiliser des signaux pour contrôler nginx.

Selon la documentation, vous devez envoyer un signal HUP au processus maître nginx.

HUP - modification de la configuration, suivi d'un fuseau horaire modifié (uniquement pour FreeBSD et Linux), démarrage de nouveaux processus de travail avec une nouvelle configuration, arrêt progressif des anciens processus de travail

Consultez la documentation ici: http://nginx.org/en/docs/control.html

Vous pouvez envoyer le signal HUP au PID du processus maître nginx comme ceci:

kill -HUP $( cat /var/run/nginx.pid )

La commande ci-dessus lit le PID nginx à partir de /var/run/nginx.pid. Par défaut, nginx pid est écrit /usr/local/nginx/logs/nginx.pidmais cela peut être remplacé dans config. Vérifiez votre nginx.configpour voir où il enregistre le PID.

hcristea
la source
1

Au moins sur Debian, le script de démarrage nginx a une fonction de rechargement qui fait:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Il semble que tout ce que vous ayez à faire est d'appeler service nginx reloadau lieu d' appeler restartdepuis test_nginx_config.

Daenney
la source
service nginx reloadne donnera aucune indication quant à savoir si la configuration testée est OK ou non, ou si elle a été rechargée ou non.
Dan Dascalescu
Que fait test_nginx_configalors dans ce cas?
Daenney
1
Je pense que vous avez tous les deux un point. service nginx reloadest suffisant sur la ligne de commande, mais parfois vous souhaiterez peut-être capturer la sortie stderr et la renvoyer à un script pour le dépannage. nginx -tvous dirait quel fichier avait le paramètre invalide et sur quelle ligne.
anastymous