如何设置systemd服务依赖关系?

在CentOS 7系统启动期间,nginx启动失败,出现以下错误:

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

我怀疑这是由于在尝试绑定到通过SSL提供虚拟主机的IP地址之前,networking接口尚未启动。

我的猜测是我需要指定network.service作为nginx.service的要求,但是我根本找不到/ etc / systemd /中的networking服务

我如何在systemd中configuration服务顺序或依赖关系?

您至less需要在单元文件的[Unit]部分中设置After=network.target ,以确保在启动nginx之前networking已经启动。 我不知道为什么你的单元文件没有它。

下面是Fedora发布的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 

从错误日志中,它看起来像你的nginxconfiguration。 文件具有显式IP地址的listen指令:

 listen abcd:443 

这意味着nginx将不会启动,除非您的networking接口已启动并且IP abcd已被分配给接口。

你有两个select:

  • 改变listen指令为:listen 443; (绑定到所有的IP地址)
  • 使nginx依赖于network-online.target

http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/中所述,network.target 仅指示networkingpipe理堆栈已启动[…]是否有任何networking接口在达到未定义。

如果你想确保IP地址已经被分配,并且接口已经打开,你需要将network-online.target添加到你的nginx的systemd单元文件中。

您的/etc/systemd/system/multi-user.target.wants/nginx.service文件的After =和Requires =行中应该有network-online.target。

 [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