Como definir as dependências do serviço systemd?

14

Durante o arranque do sistema CentOS 7, o início do nginx falha com o seguinte erro:

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

Eu suspeito que isso esteja acontecendo porque as interfaces de rede ainda não estão ativadas antes de tentar vincular a esse endereço IP para servir um vhost sobre SSL.

Meu palpite é que preciso especificar o network.service como um requisito para o nginx.service, mas não consigo encontrar o serviço de rede em / etc / systemd /.

Como posso configurar a ordem de serviço ou dependências no systemd?

    
por vincent.io 04.08.2014 / 17:45

2 respostas

14

Você precisa, no mínimo, After=network.target na seção [Unit] do seu arquivo de unidade, para garantir que a rede esteja ativa antes de iniciar o nginx. Não tenho ideia do motivo pelo qual o seu arquivo de unidade não o possui.

Aqui está um exemplo completo do meu prático sistema Fedora, fornecido pelo 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
    
por 04.08.2014 / 18:30
5

No log de erros, parece a configuração do nginx. arquivo tem uma diretiva de escuta com um endereço IP explícito:

listen a.b.c.d:443

Isso significa que o nginx não será iniciado a menos que sua interface de rede esteja ativa e o IP a.b.c.d tenha sido atribuído à interface.

Você tem duas opções:

  • altere a diretiva de escuta para: listen 443; (ligar a todos os endereços IP)
  • faz o nginx depender de network-online.target

Conforme descrito no link , o network.target indica apenas que a pilha de gerenciamento de rede [...] é se qualquer interface de rede já está configurada quando ela é alcançada é indefinida.

Se você quiser ter certeza de que o endereço IP já está atribuído e a interface está ativa, você precisa adicionar o network-online.target ao arquivo de unidade systemd do seu nginx.

Seu arquivo /etc/systemd/system/multi-user.target.wants/nginx.service deve ter network-online.target nas linhas After = e 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
    
por 11.03.2015 / 16:42