Comment définir les dépendances du service systemd?

17

Au cours du démarrage de CentOS 7, le démarrage de nginx échoue avec l'erreur suivante:

2014/08/04 17:27:34 [emerg] 790#0: bind() to a.b.c.d:443 failed (99: Cannot assign requested address)

Je soupçonne que cela se produit car les interfaces réseau ne sont pas encore actives avant d'essayer de se lier à cette adresse IP pour servir un vhost sur SSL.

Je suppose que je dois spécifier le network.service comme une exigence pour le nginx.service, mais je ne trouve pas du tout le service réseau dans / etc / systemd /.

Comment puis-je configurer l'ordre de service ou les dépendances dans systemd?

vincent.io
la source
1
N'êtes-vous pas plus à la recherche de dépendances de service que de commande ?
un CVn
Bon point! Mis à jour.
vincent.io
1
Cela peut aider: serverfault.com/questions/482730/…
Belmin Fernandez
Merci, ça le résout! Cela vous dérange de le mettre dans une réponse pour que je puisse le fermer? :)
vincent.io
J'ai supprimé ma réponse. Source de cette réponse affichée (M. Hampton). Devrait marquer son comme la bonne réponse.
Belmin Fernandez

Réponses:

19

Vous avez besoin, au minimum, After=network.target dans la [Unit]section de votre fichier d'unité, vous assurer que le réseau est opérationnel avant de démarrer nginx. Je n'ai aucune idée pourquoi votre fichier d'unité ne l'a pas.

Voici un exemple complet de mon système Fedora pratique, tel qu'il est expédié par Fedora:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Michael Hampton
la source
Merci, bonne réponse! J'ai installé nginx à partir du dépôt remi (tiers), ce qui pourrait expliquer pourquoi "After" est manquant dans le fichier d'unité.
vincent.io
1
Intéressant. Je lui laisserais un mot et lui ferais part du problème. Ses colis sont généralement de très haute qualité et je ne sais pas comment il a raté cela.
Michael Hampton
Grande suggestion, fait.
vincent.io
5

Du journal des erreurs, il ressemble à votre configuration nginx. Le fichier a une directive Listen avec une adresse IP explicite:

listen a.b.c.d:443

Cela signifie que nginx ne démarrera que si votre interface réseau est active et que l'abcd IP a été attribué à l'interface.

Vous avez deux options:

  • changez la directive listen en: listen 443; (lier à toutes les adresses IP)
  • faire dépendre nginx de network-online.target

Comme décrit dans http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ le network.target indique seulement que la pile de gestion du réseau est en place [...] Si des interfaces réseau sont déjà configurées lorsqu'elles sont atteintes n'est pas défini.

Si vous voulez vous assurer que l'adresse IP est déjà attribuée et que l'interface est en place, vous devez ajouter le network-online.target au fichier d'unité systemd de votre nginx.

Votre fichier /etc/systemd/system/multi-user.target.wants/nginx.service doit avoir network-online.target dans les lignes After = et requires =.

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target network-online.target
Requires=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Luca Gibelli
la source
1
+1 pour mentionner network-online.target- au cas où quelqu'un se demanderait aussi: oui, les deux Requires=et After=sont nécessaires parce que Requires=(sans doute surprenant) n'implique pas un ordre entre l'unité requise et l'unité requise.
maxschlepzig