Come impostare le dipendenze del servizio systemd?


17

Durante l'avvio del sistema CentOS 7, l'avvio di nginx non riesce con il seguente errore:

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

Ho il sospetto che ciò accada a causa delle interfacce di rete non ancora attive prima di tentare di associare quell'indirizzo IP per servire un vhost su SSL.

Suppongo di dover specificare network.service come requisito per nginx.service, ma non riesco a trovare il servizio di rete in / etc / systemd /.

Come posso configurare l'ordine di servizio o le dipendenze in systemd?


1
Non stai cercando più dipendenze di servizio che ordini ?
un CVn il

Buon punto! Aggiornato.
vincent.io,


Grazie, questo lo risolve! Ti dispiace metterlo in una risposta in modo da poterlo chiudere? :)
vincent.io,

Ho cancellato la mia risposta Fonte della risposta pubblicata (sig. Hampton). Dovrebbe contrassegnare la sua come la risposta corretta.
Belmin Fernandez,

Risposte:


19

È necessario, almeno, After=network.targetnella [Unit]sezione del file dell'unità, assicurarsi che la rete sia attiva prima di avviare nginx. Non ho idea del perché il tuo file di unità non lo abbia.

Ecco un esempio completo dal mio pratico sistema Fedora, spedito da 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

Grazie, ottima risposta! Ho installato nginx dal repository remi (di terze parti), il che potrebbe spiegare perché "After" non è presente nel file dell'unità.
vincent.io,

1
Interessante. Gli lasciavo un messaggio e gli facevo sapere del problema. I suoi pacchetti sono di solito di altissima qualità e non sono sicuro di come l'abbia perso.
Michael Hampton

Ottimo consiglio, fatto.
vincent.io,

5

Dal registro degli errori, sembra la tua configurazione nginx. il file ha una direttiva di ascolto con un indirizzo IP esplicito:

listen a.b.c.d:443

Ciò significa che nginx non si avvierà a meno che l'interfaccia di rete non sia attiva e l'indirizzo IP abcd non sia stato assegnato all'interfaccia.

Hai due opzioni:

  • cambia la direttiva hear in: hear 443; (associa a tutti gli indirizzi IP)
  • fai in modo che nginx dipenda da network-online.target

Come descritto in http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ the network.target indica solo che lo stack di gestione della rete è attivo [...] Se eventuali interfacce di rete sono già configurate quando viene raggiunta non è definito.

Se vuoi assicurarti che l'indirizzo IP sia già assegnato e che l'interfaccia sia attiva, devi aggiungere network-online.target al file di unità di sistema nginx.

Il tuo file /etc/systemd/system/multi-user.target.wants/nginx.service dovrebbe avere network-online.target nelle righe After = e Richiede =.

[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

1
+1 per la menzione network-online.target- nel caso qualcuno si stia chiedendo: sì, entrambi Requires=e After=sono necessari perché Requires=(probabilmente sorprendentemente) non implica un ordinamento tra l'unità richiesta e quella richiesta.
maxschlepzig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.