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

时间:2013-09-03 08:38:00

标签: ubuntu command-line nginx

当我在Ubuntu服务器上的命令行上重启nginx服务时,当nginx配置文件出错时,服务崩溃。在多站点服务器上,这会放下所有站点,甚至是没有配置错误的站点。

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

nginx -t

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

/etc/init.d/nginx restart

仅重新加载nignx网站配置而不重启:

nginx -s reload

有没有办法将restart命令有条件的那两个命令组合到配置测试的结果中?

我在网上找不到这个,the official documentation就此而言非常基础。我不太了解Linux,所以我不知道我正在寻找的是在我面前还是根本不可能。

我正在使用nginx v1.1.19。

7 个答案:

答案 0 :(得分:64)

从nginx 1.8.0开始,正确的解决方案是

sudo nginx -t && sudo service nginx reload

请注意,由于存在错误,configtest always returns a zero exit code即使配置文件有错误。

答案 1 :(得分:43)

实际上,据我所知,nginx会显示一条空消息,如果配置错误,它实际上不会重启。

搞砸它的唯一方法是做一个nginx停止然后重新开始。它会成功停止,但无法启动。

答案 2 :(得分:37)

仅当配置测试成功时,才使用以下命令重新加载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'

这里的诀窍是由“&&”完成的。如果第一个命令成功,它只执行第二个命令。您可以看到here有关“&&”使用的更详细说明操作

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

答案 3 :(得分:8)

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”等..

答案 4 :(得分:2)

您可以使用信号来控制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的位置。

答案 5 :(得分:2)

您可以使用/etc/init.d/nginx reloadsudo service nginx reload

重新加载

如果nginx -t抛出错误,则不会重新加载

因此请使用&&同时运行两者

喜欢

  

nginx -t && /etc/init.d/nginx重新加载

答案 6 :(得分:1)

至少在Debian上,nginx启动脚本有一个重载函数:

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