Como definir dependências de serviço systemd?

17

Durante a inicialização do sistema CentOS 7, o nginx start 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)

Suspeito que isso esteja acontecendo devido ao fato de as interfaces de rede ainda não estarem ativadas antes de tentar se 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?

vincent.io
fonte
11
Você não está procurando mais dependências de serviços do que pedidos ?
um CVn
Bom ponto! Atualizada.
Vincent.io
11
Isso pode ajudar: serverfault.com/questions/482730/…
Belmin Fernandez
Obrigado, isso resolve! Importa-se de responder a uma pergunta para que eu possa fechá-la? :)
vincent.io
Excluiu minha resposta. Fonte da resposta postada (Sr. Hampton). Deve marcar a dele como a resposta correta.
Belmin Fernandez 4/08/14

Respostas:

19

Você precisa, no mínimo, After=network.targetna [Unit]seção do arquivo da sua unidade, para garantir que a rede esteja funcionando antes de iniciar o nginx. Não faço ideia por que o arquivo da sua unidade não o possui.

Aqui está um exemplo completo do meu prático sistema Fedora, enviado 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
Michael Hampton
fonte
Obrigado, ótima resposta! Instalei o nginx a partir do repositório remi (de terceiros), o que pode explicar por que "Depois" está ausente no arquivo de unidade.
Vincent.io
11
Interessante. Eu mandava um bilhete para ele e informava sobre o problema. Seus pacotes são geralmente de alta qualidade e não tenho certeza de como ele perdeu isso.
Michael Hampton
Ótima sugestão, feita.
Vincent.io #
5

No log de erros, parece com a sua configuração nginx. O arquivo possui 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 abcd IP tenha sido atribuído à interface.

Você tem duas opções:

  • altere a diretiva listen para: listen 443; (vincular a todos os endereços IP)
  • faça o nginx depender do network-online.target

Conforme descrito em http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/, o network.target indica apenas que a pilha de gerenciamento de rede está ativa [...] Se alguma interface de rede já está configurada quando é alcançada está indefinido.

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

Seu arquivo /etc/systemd/system/multi-user.target.wants/nginx.service deve ter network-online.target nas linhas Após = e Requer =.

[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
fonte
11
+1 para mencionar network-online.target- caso alguém também esteja se perguntando: sim, ambos Requires=e After=são necessários porque Requires=(sem dúvida surpreendentemente) não implica uma ordem entre a unidade necessária e a necessária.
Maxschlepzig