如何在ubuntu上configurationtesting成功后才能重新启动nginx?

当我在ubuntu服务器的命令行中重新启动nginx服务时,当nginxconfiguration文件有错误时,服务崩溃。 在多站点服务器上,这将放下所有站点,甚至没有configuration错误的站点。

为了防止这种情况,我首先运行nginxconfigurationtesting:

nginx -t 

testing运行成功后,我可以重新启动服务

 /etc/init.d/nginx restart 

或者只重新加载nignx站点configuration而不重新启动

 nginx -s reload 

有没有一种方法可以将重启命令有条件的这两个命令组合到configurationtesting的结果中?

我无法在网上find这个官方文档 ,这是相当基本的。 我不知道我的Linux的方式,所以我不知道我在找什么是正确的在我面前或根本不可能。

我正在使用nginx v1.1.19

任何帮助,这是表示赞赏。

实际上,据我所知,nginx会显示一个空的消息,如果配置不好,它不会真正重启,唯一的办法是搞一个nginx stop然后重新启动,它会成功停止但失败开始。

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

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

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

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