nginx 无法在启动时启动,但手动启动时可以正常启动。日志内容如下
nginx: [emerg] host not found in upstream "{some hostname}" in /etc/nginx/conf.d/some_site.conf
nginx: configuration file /etc/nginx/nginx.conf test failed
Failed to start A high performance web server and a reverse proxy server.
nginx.service: Unit entered failed state.
nginx.service: Failed with result 'exit-code'.
似乎启动时 DNS 尚未准备好,并且 nginx 正在尝试查找我作为反向代理的主机名。
答案1
经过一番研究,发现 systemd 使用下面的文件来启动 nginx
/lib/systemd/system/nginx.service
Ubuntu 15.04、Ubuntu 15.10 上的文件,甚至 nginx 网站本身都说使用下面的 After 行
After=network.target
这让人觉得网络应该已经启动并准备就绪。然而,我发现了链接http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/说的是
network.target 在启动过程中意义不大。它只表示在到达该目标后网络管理堆栈已启动。
该链接继续说
network-online.target 是一个主动等待网络“up”的目标,其中“up”的定义由网络管理软件定义。
所以我改变了使用后的样子
After=network-online.target
现在 nginx 在启动时启动正常。我并不是说这是完全正确的解决方案,因为可能应该使用不同的 After 目标,这样在某些方面会更正确,但这似乎在最后几次重启中有效。