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.
Réponses:
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.
la source
service nginx reload
ne 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 restart
arrêtera le serveur si la configuration a une erreur!À partir de nginx 1.8.0, la solution correcte est
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.la source
nginx -t
sans sudo échouera presque certainement en raison d'erreurs d'autorisation.J'utilise la commande suivante pour recharger Nginx (version 1.5.9) uniquement si un test de configuration a réussi:
Si vous devez le faire souvent, vous pouvez utiliser un alias. J'utilise ce qui suit:
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.
la source
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.nginx -t
plutôt.puis utilisez les commandes "nginx.reload" etc.
la source
Vous pouvez recharger en utilisant
/etc/init.d/nginx reload
etsudo service nginx reload
Si
nginx -t
jette une erreur, il ne se rechargera pasalors utilisez && pour exécuter les deux en même temps
comme
la source
run both at a same time
Elle exécute la commande sur la droite SI la commande sur la gauche renvoie un code de sortie de 0. Si vousnginx -t
lancez une erreur, le code de sortie ne sera pas 0, donc la deuxième commande ne sera pas exécutée. C'estnginx -s reload
quand mêmeIf nginx -t throws some error then it won't reload
. L'instructionrun both at a same time
peut également être interprétée comme une seule commande ou une ligne. Je ne l'interprète pas nécessairement en disant dans ce casin parallel
.Vous pouvez utiliser des signaux pour contrôler nginx.
Selon la documentation, vous devez envoyer un signal HUP au processus maître nginx.
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:
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.pid
mais cela peut être remplacé dans config. Vérifiez votrenginx.config
pour voir où il enregistre le PID.la source
Au moins sur Debian, le script de démarrage nginx a une fonction de rechargement qui fait:
Il semble que tout ce que vous ayez à faire est d'appeler
service nginx reload
au lieu d' appelerrestart
depuistest_nginx_config
.la source
service nginx reload
ne donnera aucune indication quant à savoir si la configuration testée est OK ou non, ou si elle a été rechargée ou non.test_nginx_config
alors dans ce cas?service nginx reload
est 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 -t
vous dirait quel fichier avait le paramètre invalide et sur quelle ligne.