如何设置systemd服务依赖项?


17

在CentOS 7系统引导过程中,nginx启动失败,并显示以下错误:

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

我怀疑这是由于尝试绑定到该IP地址以通过SSL为虚拟主机提供服务之前尚未启用网络接口而导致的。

我的猜测是我需要将network.service指定为nginx.service的要求,但是我根本无法在/ etc / systemd /中找到该网络服务。

如何在systemd中配置服务顺序或依赖关系?


1
您不是在寻找服务依赖性而不是订购吗?
2014年

好点子!更新。
vincent.io 2014年


谢谢,解决了!介意回答一下,以便我可以关闭它吗?:)
vincent.io 2014年

删除了我的答案。该答案的来源(汉普顿先生)。应该将他标记为正确答案。
Belmin Fernandez 2014年

Answers:


19

您至少需要在单元文件After=network.target[Unit]部分中,确保在启动nginx之前网络已启动。我不知道为什么您的单位文件没有它。

这是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

谢谢,很好的答案!我从remi存储库(第三方)安装了nginx,这也许可以解释为什么单元文件中缺少“ After”。
vincent.io 2014年

1
有趣。我会给他一张纸条,让他知道这个问题。他的包裹通常质量很高,我不确定他是怎么错过的。
迈克尔·汉普顿

很棒的建议,完成了。
vincent.io 2014年

5

从错误日志中,它看起来像您的nginx配置。文件有一个带有明确IP地址的listen指令:

listen a.b.c.d:443

这意味着除非您的网络接口已启动并且 IP abcd已分配给该接口,否则nginx不会启动。

您有两种选择:

  • 将listen指令更改为:listen 443; (绑定到所有IP地址)
  • 使Nginx依赖network-online.target

http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/中所述,network.target 仅表示网络管理堆栈已启动,到达时是否已配置任何网络接口。未定义。

如果要确保已经分配了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

1
1用于提network-online.target-的情况下,有人也想知道:是,既Requires=After=因为是必要的Requires=(可以说出奇)并不意味着所要求的单元和要求一个之间的排序。
maxschlepzig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.