如何设置 systemd 服务依赖项?

如何设置 systemd 服务依赖项?

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 为 vhost 提供服务之前,网络接口尚未启动。

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

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

答案1

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

下面是 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

答案2

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

listen a.b.c.d:443

这意味着,除非你的网络接口已启动,否则 nginx 将无法启动IP abcd 已分配给接口。

您有两个选择:

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

正如所述http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/网络目标仅表示网络管理堆栈已启动 [...] 当达到该状态时是否已经配置了任何网络接口是未定义的。

如果您想确保 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

相关内容