123

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

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

nginx -t

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

/etc/init.d/nginx restart

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

nginx -s reload

有没有办法组合这两个命令,其中重启命令取决于配置测试的结果?

我在网上找不到这个,关于这个的官方文档是相当基本的。我不太了解 Linux,所以我不知道我正在寻找的东西是在我面前还是根本不可能。

我正在使用 nginx v1.1.19。

4

7 回答 7

92

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

sudo nginx -t && sudo service nginx reload

请注意,由于存在错误,即使配置文件有错误,也configtest始终返回零退出代码。

于 2015-05-19T01:54:06.813 回答
49

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

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

于 2013-09-03T09:43:43.067 回答
40

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

这里的技巧是由“&&”完成的,如果第一个命令成功,它只执行第二个命令。您可以在此处查看有关“&&”运算符使用的更详细说明。

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

于 2014-01-24T16:55:50.347 回答
9
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”等。

于 2016-10-17T21:36:28.607 回答
9

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

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

所以使用 && 同时运行两者

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

于 2018-07-07T09:35:13.887 回答
3

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

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

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 被写入,/usr/local/nginx/logs/nginx.pid但可以在配置中覆盖。检查您nginx.config以查看它保存 PID 的位置。

于 2014-07-07T08:55:38.703 回答
1

至少在 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.

于 2014-02-26T15:53:21.010 回答