¿Cómo establecer dependencias de servicio systemd?

17

Durante el inicio del sistema CentOS 7, el inicio de nginx falla con el siguiente error:

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

Sospecho que esto está sucediendo debido a que las interfaces de red aún no están activas antes de intentar enlazar a esa dirección IP para servir un vhost sobre SSL.

Supongo que necesito especificar el network.service como un requisito para el nginx.service, pero no puedo encontrar el servicio de red en / etc / systemd / en absoluto.

¿Cómo puedo configurar el orden de servicio o las dependencias en systemd?

vincent.io
fuente
1
¿No estás buscando más dependencias de servicio que orden ?
un CVn
¡Buen punto! Actualizado.
vincent.io
1
Esto puede ayudar: serverfault.com/questions/482730/…
Belmin Fernandez
Gracias, eso lo resuelve! ¿Te importaría ponerlo en una respuesta para poder cerrarlo? :)
vincent.io
Eliminé mi respuesta. Fuente de esa respuesta publicada (Sr. Hampton). Debe marcar la suya como la respuesta correcta.
Belmin Fernández el

Respuestas:

19

Debe, como mínimo, After=network.targeten la [Unit]sección del archivo de su unidad, asegurarse de que la red esté activa antes de iniciar nginx. No tengo idea de por qué su archivo de unidad no lo tiene.

Aquí hay un ejemplo completo de mi práctico sistema Fedora, tal como lo envió 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
fuente
Gracias, gran respuesta! Instalé nginx desde el repositorio de remi (de terceros), lo que podría explicar por qué falta "Después" en el archivo de la unidad.
vincent.io
1
Interesante. Le dejaría una nota y le haría saber sobre el problema. Sus paquetes suelen ser de muy alta calidad y no estoy seguro de cómo se perdió eso.
Michael Hampton
Gran sugerencia, hecho.
vincent.io
5

Desde el registro de errores, se parece a su configuración nginx. El archivo tiene una directiva de escucha con una dirección IP explícita:

listen a.b.c.d:443

Esto significa que nginx no arrancará a menos que su interfaz de red está activa y el ABCD IP ha sido asignada a la interfaz.

Tienes dos opciones:

  • cambiar la directiva de escucha a: escuchar 443; (enlazar a todas las direcciones IP)
  • hacer que nginx dependa de network-online.target

Como se describe en http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/, el network.target solo indica que la pila de administración de red está activada [...] si las interfaces de red ya están configuradas cuando se alcanza es indefinido.

Si desea asegurarse de que la dirección IP ya esté asignada y que la interfaz esté activa, debe agregar network-online.target al archivo de unidad systemd de su nginx.

Su archivo /etc/systemd/system/multi-user.target.wants/nginx.service debe tener network-online.target en las líneas After = y Requiere =.

[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
fuente
1
+1 por mencionar network-online.target, en caso de que alguien también se pregunte: sí, ambos Requires=y After=son necesarios porque Requires=(posiblemente sorprendentemente) no implica un pedido entre la unidad requerida y la unidad requerida.
maxschlepzig