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)
从错误日志来看,它看起来像你的 nginx 配置。文件有一个带有显式 IP 地址的监听指令:
listen a.b.c.d:443
Run Code Online (Sandbox Code Playgroud)
这意味着除非您的网络接口已启动并且IP abcd 已分配给该接口,否则 nginx 不会启动。
您有两个选择:
如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)
归档时间: |
|
查看次数: |
45202 次 |
最近记录: |