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


111

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

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

nginx -t

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

/etc/init.d/nginx restart

仅在不重新启动的情况下重新加载nignx站点配置:

nginx -s reload

在重启命令取决于配置测试结果的情况下,是否有办法组合这两个命令?

我在网上找不到此文件,并且此文件的正式文档非常基础。我不太了解Linux,所以我不知道我要寻找的东西是否就在眼前。

我正在使用nginx v1.1.19。


关于一个小的shell脚本,该脚本检查nginx -t(带有$?)的返回状态,然后根据返回状态重新启动吗?
TeTeT

Answers:


49

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

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


1
您在说什么版本的Nginx?我正在使用v 1.1.19,无论配置文件中的任何错误,它都将尝试重新启动。它会通知我有问题,但是那时已经太迟了
2013年1

5
好的,我刚刚对其进行了测试,我的笔记本电脑具有nginx 1.2,并且可以按照我的描述工作,我的VPS具有与您一样的1.1.19,并且其性能与您在问题中所描述的相同。所以我想这是在1.2版中处理的
Mohammad AbuShady 2013年

大!感谢您帮我弄清楚这一点。我将问题悬而未决,看看是否没有人回答nginx <v1.2
2013年1

1
我想我必须先升级:-)无论如何都需要借口
2013年1

1
service nginx reload无论配置是否正确加载,都不会显示任何内容,因此如果您怀疑配置可能不正确,它就没有用。service nginx restart如果配置有错误,将停止服务器!
Dan Dascalescu 2015年

80

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

sudo nginx -t && sudo service nginx reload

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


3
nginx -t && sudo nginx -s reload
MechanisM

5
@MechanisM:nginx -t如果没有sudo,几乎肯定会由于权限错误而失败。
Dan Dascalescu

我想展示大部分重装的最后一部分。就我而言,我已经自定义编译了nginx,甚至在/etc/init.d中都没有任何脚本,依此类推,因此就我而言,“ service nginx reload”将不起作用
MechanisM

39

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

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

如果您确实要重新启动服务器,则可以使用“重新启动”而不是“重新加载”。


当心nginx 1.4.2,我发现pkill -1 nginx(实际上,我的init.d / nginx重新加载会做什么)不会重新加载,如果配置失败并误导返回成功。检查您自己的版本。
KCD 2014年

2
这对我不起作用。即使测试失败,两个命令也会执行。
Mario Campa 2014年

2
configtest总是返回零退出代码,至少在nginx 1.8.0中。使用nginx -t代替。
Dan Dascalescu 2015年

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


6

您可以使用/etc/init.d/nginx reload和重新加载sudo 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

@miknik我认为这就是他的意思,只是没有正确显示。他说If nginx -t throws some error then it won't reload。该语句run both at a same time也可以解释为单个命令或一行。在这种情况下我不一定解释他的话in parallel
马特

2

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

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

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

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

您可以将HUP信号发送到nginx主进程PID,如下所示:

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

上面的命令从中读取nginx PID /var/run/nginx.pid。默认情况下,会写入nginx pid,/usr/local/nginx/logs/nginx.pid但可以在config中覆盖它。检查您的内容,nginx.config以了解其将PID保存在何处。


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


service nginx reload不会给出有关配置是否测试正常或是否已重新加载的任何指示。
Dan Dascalescu 2015年

test_nginx_config在那种情况下该怎么办?
丹妮2015年

1
我想你们俩都有观点。service nginx reload在命令行上就足够了,但是有时您可能想要捕获stderr输出并将其返回给脚本以进行故障排除。nginx -t会告诉您哪个文件的参数无效以及在哪一行。
anastymous
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.