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

Posted

技术标签:

【中文标题】在Ubuntu上配置测试成功后如何重启nginx?【英文标题】:How do I restart nginx only after the configuration test was successful on Ubuntu? 【发布时间】:2013-09-06 09:56:02 【问题描述】:

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

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

nginx -t

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

/etc/init.d/nginx restart

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

nginx -s reload

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

我在网上找不到这个,the official documentation 这个是相当基本的。我不太了解 Linux,所以我不知道我正在寻找的东西是在我面前还是根本不可能。

我正在使用 nginx v1.1.19。

【问题讨论】:

一个小shell脚本检查nginx -t(带$?)的返回状态然后根据返回状态重新启动呢? 【参考方案1】:

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

解决这个问题的唯一方法是让 nginx 停止然后重新启动。它会成功停止,但无法启动。

【讨论】:

你说的是哪个版本的nginx?我正在使用 v 1.1.19,无论配置文件中是否有任何错误,它都会尝试重新启动。它会通知我有问题,但到那时已经太晚了 好的,我刚刚测试了它,我的笔记本电脑有 nginx 1.2,它按照我描述的方式工作,我的 VPS 有 1.1.19 和你的一样,它和你在问题中描述的一样。所以我猜这是在 1.2 中处理的 太棒了!感谢您为我解决这个问题。我会把这个问题留得更久,看看是否没有人对 nginx 有答案 我想我得升级了 :-) 无论如何都需要一个借口 service nginx reload 不显示配置是否正确加载,因此如果您怀疑配置可能不正确,它是无用的。 service nginx restart如果配置有错误将停止服务器!【参考方案2】:

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

【讨论】:

当心 nginx 1.4.2 我发现 pkill -1 nginx(实际上是我的 init.d/nginx 重新加载所做的)如果配置失败并且误导性地返回成功,则不会重新加载。检查您自己的版本。 这对我不起作用。即使测试失败,这两个命令也会执行。 configtest always returns a zero exit code,至少在 nginx 1.8.0 中。请改用nginx -t【参考方案3】:

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

【讨论】:

service nginx reload 不会给出任何关于配置测试是否正常或是否重新加载的指示。 在这种情况下test_nginx_config 会做什么? 我认为你们俩都有道理。 service nginx reload 在命令行上就足够了,但是有时您可能希望捕获 stderr 输出并将其返回到脚本以进行故障排除。 nginx -t 会告诉你哪个文件的参数无效以及在哪一行。【参考方案4】:

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

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

HUP - 更改配置,跟上更改的时区(仅适用于 FreeBSD 和 Linux),使用新配置启动新工作进程,正常关闭旧工作进程

在此处查看文档:http://nginx.org/en/docs/control.html

你可以像这样向 nginx 主进程 PID 发送 HUP 信号:

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

上面的命令从/var/run/nginx.pid读取nginx PID。默认情况下,nginx pid 被写入/usr/local/nginx/logs/nginx.pid,但可以在配置中覆盖。检查您的 nginx.config 以查看它保存 PID 的位置。

【讨论】:

【参考方案5】:

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

sudo nginx -t && sudo service nginx reload

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

【讨论】:

nginx -t && sudo nginx -s 重新加载 @MechanisM: nginx -t 没有 sudo 几乎肯定会因为权限错误而失败。 我想主要展示最后一部分以供重新加载。在我的情况下,我有自定义编译的 nginx,甚至在 /etc/init.d 等中没有任何脚本,所以在我的情况下,“服务 nginx 重新加载”不会做任何事情【参考方案6】:
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”等..

【讨论】:

【参考方案7】:

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

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

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

喜欢

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

【讨论】:

让我教你一些关于 bash 的知识。 && 不 run both at a same time 如果左侧的命令返回退出代码 0,它会运行右侧的命令。如果您的 nginx -t 抛出错误,则退出代码不会为 0,因此第二个命令将不会运行。反正是nginx -s reload @miknik 我认为这就是他的意思,只是结果不正确。他说If nginx -t throws some error then it won't reload。语句run both at a same time 也可以解释为单个命令或一行。在这种情况下,我不一定会解释他说in parallel

以上是关于在Ubuntu上配置测试成功后如何重启nginx?的主要内容,如果未能解决你的问题,请参考以下文章

docker php-fpm 一直重启问题处理

Nginx常用命令(启动/重启/停止/测试配置文件/重新加载配置文件)

Ubuntu降级内核

Flask+Nginx+uWSGI在Ubuntu服务器上的配置

Nginx常用命令(启动/重启/停止/测试配置文件/重新加载配置文件)

如何配置服务器的php,使得能成功运行exec函数?