web-dev-qa-db-fra.com

Comment redémarrer nginx uniquement une fois le test de configuration réussi sur Ubuntu?

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 tous les sites, même ceux qui ne présentent pas d’erreur de configuration.

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

nginx -t

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

/etc/init.d/nginx restart

Ou ne rechargez que les configurations de site nignx sans redémarrage:

nginx -s reload

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

Je ne pouvais pas trouver ceci en ligne et la documentation officielle sur c'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.

98
jan

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

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.

44
Mohammad AbuShady

À partir de nginx 1.8.0, la solution correcte est

Sudo nginx -t && Sudo service nginx reload

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

65
Dan Dascalescu

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 les éléments suivants:

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

Le truc est fait ici par "&&" 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.

38
Mauricio Sánchez
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.

8
MechanisM

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

Si nginx -t génère une erreur, il ne sera pas rechargé.

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

comme

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

3
gokul kandasamy

Vous pouvez utiliser des signaux pour contrôler nginx.

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

HUP - modification de la configuration, adaptation à un fuseau horaire modifié (uniquement pour FreeBSD et Linux), démarrage de nouveaux processus de travail avec une nouvelle configuration, arrêt progressif d'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 suit:

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 dans /usr/local/nginx/logs/nginx.pid mais vous pouvez le remplacer par config. Vérifiez votre nginx.config pour voir où il enregistre le PID.

2
hcristea

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

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 $?
  ;;

On dirait que tout ce que vous devez faire est d'appeler service nginx reload au lieu de restart puisqu'il appelle test_nginx_config.

1
Daenney