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.
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.
À 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.
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.
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.
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
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.
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
.