9 votes

"sudo service nginx start" échoue mais "sudo nginx" fonctionne - je ne comprends pas pourquoi

J'ai un serveur qui est presque neuf et j'ai un problème pour faire démarrer nginx comme prévu. J'ai configuré un autre serveur essentiellement de la même manière et cela fonctionne là-bas. Je me dis qu'il doit y avoir une différence environnementale entre les deux, mais je n'ai pas réussi à la trouver.

La version courte :

Starts - sudo nginx
Fails - sudo service nginx start
Fails - sudo service nginx restart
works - sudo service nginx stop

Lorsque les commandes échouent, elles ne disent pas vraiment autre chose :

 * Restarting nginx nginx                                                [fail]

Rien d'autre dans les fichiers journaux (nginx [accès ou erreur], syslog) ou écrit à l'écran

Plus de détails :

Les deux disent que le fichier de configuration est OK

sudo service nginx configtest
sudo nginx -t
  • J'ai vérifié les permissions pour nginx.conf et elles sont correctes (comme sur le serveur en fonctionnement). J'ai vérifié deux fois que www-data avait accès aux fichiers journaux et autres et c'est le cas.

  • Le fichier /etc/init.d/nginx est le même sur les deux serveurs ainsi que la commande utilisée (voir ci-dessus)

  • Les fichiers journaux existent

  • utilisateur/groupe www-data existe

  • Ubuntu 12.04 LTS

  • nginx 1.6

  • Exécuté la demande - sudo strace service nginx start sur chaque erver A part le premier élément ci-dessous, les seules autres différences que j'ai vues entre l'exécution sur les deux serveurs différents étaient des choses comme les pointeurs et le PID. J'ai préfixé les deux lignes par ensemble qui sont différentes avec ***

\==== Celui qui fonctionne

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd6076a09d0) = 24394
close(4)                                = 0
*** read(3, "/run/nginx.pid\n", 128)        = 15

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 24396
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?

\=============== Celui qui échoue

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f067e79d9d0) = 21761
close(4)                                = 0
*** read(3, "/run/nginx.pid\nserver_name\n", 128) = 27

(… snip till the bottom…)

*** rt_sigreturn(0x11)                      = 21763
dup2(11, 2)                             = 2
close(11)                               = 0
read(10, "", 8192)                      = 0
exit_group(0)                           = ?

0 votes

Pour la trace, vous mentionnez que ce que vous avez posté sont les seules différences que vous avez vues. Pouvez-vous réellement faire une différence entre les deux sorties pour avoir quelque chose de plus canonique ?

10voto

Mevin Babu Points 201

J'ai rencontré une situation similaire et c'était parce que le port était déjà utilisé par un autre service.

Comment l'ai-je découvert ?

Essayez de courir

sudo nginx

plutôt que de le démarrer comme un service et il devrait afficher le message d'erreur.

0 votes

Merci pour le conseil, mais c'est l'une des premières choses que j'ai vérifiées. L'ordinaire sudo nginx était mon démarrage alternatif qui a fonctionné. Il n'y avait pas de message d'erreur, c'est pourquoi c'était si étrange.

1 votes

C'était super utile. Je ne connaissais pas cette commande. Merci.

0 votes

C'est très utile ; cela révèle le message d'erreur que je recherchais.

2voto

user233864 Points 317

Ce ne sera pas une réponse très satisfaisante ou populaire, mais c'est ce que j'ai trouvé.

Il semble que le mécanisme upstart soit très sensible aux conditions externes qui vont au-delà de ce dont nginx lui-même se préoccupait.

Puisque j'avais une mesure palliative pour démarrer nginx en dehors de upstart, j'ai continué à mettre à jour mon serveur. Quand il s'est agi de redémarrer nginx pour s'assurer qu'il utilisait l'environnement actuel, j'ai utilisé "sudo service nginx restart" pour arrêter l'actuel, puis j'ai entré manuellement la commande de démarrage qui a échoué dans le upstart script(l'arrêt a fonctionné c'est le démarrage qui a échoué). Après avoir fait cela pendant un certain temps et mis à jour les sous-domaines et les fichiers à servir ainsi que d'autres petites choses, brusquement. le "sudo service nginx restart" a fonctionné. À aucun moment, le démarrage manuel de nginx ou les commandes "sudo service nginx restart" n'ont émis d'erreurs ou d'avertissements que j'ai pu trouver.

Tout ce que je peux penser, c'est qu'il doit y avoir une condition qui était en dessous du seuil d'émission de tout type d'erreur ou d'avertissement qui a dérangé upstart, mais pas nginx. Bien que cela soit suffisant pour le faire échouer, cela ne l'a pas dérangé suffisamment pour qu'il envoie un message expliquant pourquoi il échouait. Arrgh !

0voto

chicks Points 3599

Les fichiers journaux et les répertoires parents appartiennent-ils ou peuvent-ils être lus par les personnes suivantes ? www-data ? Les fichiers, répertoires et répertoires parents que vous voulez servir appartiennent-ils ou peuvent-ils être lus par les personnes suivantes ? www-data ?

Tu pourrais essayer de faire du strace. Si c'est le cas, lancez :

sudo strace service nginx start

ce qui produira beaucoup de résultats. Quelque part vers la fin, vous verrez probablement une erreur de permission. Il peut être plus facile de sauvegarder la sortie de strace dans un fichier et de le parcourir avec un grep.

Une autre option serait de passer à la www-data et voyez si vous obtenez des erreurs en lisant/écrivant manuellement les fichiers journaux ou en lisant les autres fichiers que vous voulez servir. Même si www-data a un mauvais Shell que vous pouvez faire :

sudo su -s /bin/bash www-data

Si vous exécutez whoami dans ce Shell, il devrait être dit que www-data .

0 votes

J'utilise SUDO, donc les autorisations de fichiers ne devraient pas être un problème. À un moment donné, j'ai laissé SUDO de côté et j'ai reçu des messages d'erreur de permissions. De plus, les permissions de fichiers et les informations sur l'utilisateur sont les mêmes que sur le serveur qui fonctionne. Mais je vais jeter un coup d'oeil

0 votes

J'ai vérifié et mis à jour la question. Pas d'erreur de permission et j'ai inclus une partie de la sortie de strace dans la question. La principale différence est l'ajout d'un nom de serveur à une commande interne "/run/nginx.pid". \nserver_name\n "

0 votes

Quelque chose de bizarre doit se passer dans le script de départ. Est-ce que ça ressemble à gist.github.com/squarism/3400259 ??

-1voto

CameronNemo Points 399

Vous pouvez essayer d'utiliser le job Upstart suivant et voir si cela fait une différence :

description "nginx - small, powerful, scalable web/proxy server"

start on filesystem and static-network-up
stop on runlevel [016] or unmounting-filesystem or deconfiguring-networking

expect fork
respawn

pre-start script
    [ -x /usr/sbin/nginx ] || { stop; exit 0; }
    exec /usr/sbin/nginx -q -t -g 'daemon on; master_process on;'
end script

exec /usr/sbin/nginx -g 'daemon on; master_process on;'

pre-stop exec /usr/sbin/nginx -s quit

https://bitbucket.org/CameronNemo/upstart-jobs/src/5248c9e3e0f5343bc856ccde380e78c539fbfbe9/nginx.conf?at=master

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X