web-dev-qa-db-fra.com

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

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?

17
vincent.io

Vous avez besoin, au minimum, de After=network.target dans le [Unit] section de votre fichier d'unité, pour 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
20
Michael Hampton

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 opérationnelle et l'IP a.b.c.d a été attribuée à 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 uniquement que la pile de gestion du réseau est en place [...] La question de savoir si des interfaces réseau sont déjà configurées lorsqu'elle est atteinte n'est pas définie.

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 devrait 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
5
Luca Gibelli