如何设置systemd服务依赖?

vin*_*.io 20 nginx centos service boot 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mic*_*ton 24

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

下面是一个来自我的方便的 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
Run Code Online (Sandbox Code Playgroud)


Luc*_*lli 9

从错误日志来看,它看起来像你的 nginx 配置。文件有一个带有显式 IP 地址的监听指令:

listen a.b.c.d:443
Run Code Online (Sandbox Code Playgroud)

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

您有两个选择:

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

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

如果你想确保已经分配了 IP 地址并且接口是 up 的,你需要将 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
Run Code Online (Sandbox Code Playgroud)

  • +1 提到 `network-online.target` - 如果有人也想知道:是的,`Requires=` 和 `After=` 都是必要的,因为 `Requires=`(可以说是令人惊讶)并不意味着需要的单位和需要的单位。 (3认同)