在 Ubuntu 上的配置测试成功之后,如何重新启动 nginx?

当我在 Ubuntu 服务器上的命令行上重新启动 nginx 服务时,当 nginx 配置文件出现错误时,该服务会崩溃。在多站点服务器上,这会关闭所有站点,甚至是那些没有配置错误的站点。

为了防止这种情况,我首先运行 nginx 配置测试:

nginx -t

测试成功后,我可以重新启动服务:

/etc/init.d/nginx restart

只重新加载 nignx 站点配置而不重新启动:

nginx -s reload

有没有一种方法可以将这两个命令结合起来,在这两个命令中,重新启动命令是以配置测试的结果为条件的?

我找不到这在线和 官方文件在这是相当基本的。我对 Linux 不是很了解,所以我不知道我要找的东西是否就在我面前,或者根本不可能。

我使用的是 nginx v1.1.19。

227993 次浏览

实际上,据我所知,nginx 会显示一个空消息,如果配置不好,它实际上不会重新启动。

唯一的办法搞砸它是做一个 nginx 停止,然后重新开始。它会成功地停止,但不能开始。

只有在配置测试成功的情况下,我才使用以下命令重新加载 Nginx (版本1.5.9) :

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

如果你需要经常这样做,你可能需要使用一个别名:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

这里的技巧是通过“ & &”完成的,它只在第一个命令成功时执行第二个命令。您可以看到 给你对“ & &”操作符的使用的更详细的解释。

如果您真的想重新启动服务器,可以使用“重新启动”而不是“重新加载”。

至少在 Debian 上,nginx 启动脚本有一个 reload 函数,它可以:

reload)
log_daemon_msg "Reloading $DESC configuration" "$NAME"
test_nginx_config
start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
--oknodo --exec $DAEMON
log_end_msg $?
;;

似乎所有你需要做的是调用 service nginx reload而不是 restart,因为它调用 test_nginx_config

您可以使用信号来控制 nginx。

根据文档,您需要将 HUP 信号发送到 nginx 主进程。

改变 HUP 配置,跟上时区的变化(只适用于 FreeBSD 和 Linux) ,用新配置启动新的工作进程,优雅地关闭旧的工作进程

检查这里的文档: http://nginx.org/en/docs/control.html

您可以像下面这样将 HUP 信号发送到 nginx 主进程 PID:

kill -HUP $( cat /var/run/nginx.pid )

上面的命令从 /var/run/nginx.pid读取 nginx PID。默认情况下,nginx pid 写入 /usr/local/nginx/logs/nginx.pid,但是可以在 config 中重写它。检查你的 nginx.config看看它在哪里保存 PID。

对于 nginx 1.8.0,正确的解决方案是

sudo nginx -t && sudo service nginx reload

请注意,由于一个 bug,即使配置文件有错误,configtest始终返回零退出代码

alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

然后使用命令“ nginx.reload”等。

可以使用 /etc/init.d/nginx reloadsudo service nginx reload重新加载

如果 nginx -t抛出一些错误,那么它将不会重新加载

所以使用 & & 同时运行这两个命令

喜欢

Nginx-t & &/etc/init.d/nginx reload