Wie werden Systemd-Dienstabhängigkeiten festgelegt?

17

Während des Systemstarts von CentOS 7 schlägt nginx mit dem folgenden Fehler fehl:

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

Ich vermute, dass dies passiert, weil die Netzwerkschnittstellen noch nicht aktiv sind, bevor versucht wird, eine Verbindung zu dieser IP-Adresse herzustellen, um einen vhost über SSL bereitzustellen.

Ich schätze, ich muss network.service als Voraussetzung für nginx.service angeben, kann den Netzwerkdienst jedoch überhaupt nicht in / etc / systemd / finden.

Wie kann ich den Serviceauftrag oder die Abhängigkeiten in systemd konfigurieren?

vincent.io
quelle
1
Sind nicht auf der Suche Sie mehr für Service - Abhängigkeiten als Auftrag ?
ein Lebenslauf vom
Guter Punkt! Aktualisiert.
vincent.io
1
Dies kann helfen: serverfault.com/questions/482730/…
Belmin Fernandez
Danke, das löst es! Hast du etwas dagegen, es in eine Antwort zu schreiben, damit ich es schließen kann? :)
vincent.io
Löschte meine Antwort. Quelle dieser Antwort gepostet (Mr. Hampton). Sollte seine als die richtige Antwort markieren.
Belmin Fernandez

Antworten:

19

Sie müssen mindestens After=network.targetim [Unit]Abschnitt Ihrer Gerätedatei sicherstellen, dass das Netzwerk aktiv ist, bevor Sie nginx starten. Ich habe keine Ahnung, warum Ihre Unit-Datei es nicht hat.

Hier ist ein vollständiges Beispiel von meinem handlichen Fedora-System, wie es von Fedora geliefert wurde:

[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
quelle
Danke, tolle Antwort! Ich habe nginx aus dem Remi-Repository (von Drittanbietern) installiert. Dies könnte erklären, warum "After" in der Unit-Datei fehlt.
vincent.io
1
Interessant. Ich würde ihm eine Nachricht schreiben und ihn über das Problem informieren. Seine Pakete sind normalerweise von sehr hoher Qualität und ich bin mir nicht sicher, wie er das verpasst hat.
Michael Hampton
Toller Vorschlag, fertig.
vincent.io
5

Aus dem Fehlerprotokoll geht hervor, dass es sich um Ihre Nginx-Konfiguration handelt. Datei hat eine Listen-Direktive mit einer expliziten IP-Adresse:

listen a.b.c.d:443

Dies bedeutet, dass nginx erst gestartet wird, wenn Ihre Netzwerkschnittstelle aktiv ist und der Schnittstelle die IP-Adresse abcd zugewiesen wurde.

Sie haben zwei Möglichkeiten:

  • ändere die listen Direktive in: listen 443; (an alle IP-Adressen binden)
  • mach nginx von network-online.target abhängig

Wie in http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ beschrieben, zeigt network.target nur an, dass der Netzwerkverwaltungsstapel aktiv ist [...] und ob Netzwerkschnittstellen bereits konfiguriert sind, wenn sie erreicht sind ist nicht definiert.

Wenn Sie sicherstellen möchten, dass die IP-Adresse bereits vergeben ist und die Schnittstelle aktiv ist, müssen Sie das network-online.target zur systemd-Unit-Datei Ihres nginx hinzufügen.

Ihre /etc/systemd/system/multi-user.target.wants/nginx.service-Datei sollte network-online.target in den Zeilen After = und Requires = enthalten.

[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
quelle
1
+1 für die Erwähnung network-online.target- falls sich jemand auch wundert: ja, beides Requires=und After=ist notwendig, weil Requires=(wohl überraschend) keine Bestellung zwischen der erforderlichen und der erforderlichen Einheit impliziert.
Maxschlepzig