我对确保nginx始终处于启用状态感到困惑。我理解init.d脚本只是启动和停止nginx。它是否正确?然后在文档中说它保持daemon = off;
现在,我想使用runit,下面是我的runit运行脚本:
#!/bin/sh
exec /etc/init.d/nginx start
我注意到总是会创建一个新的PID。
总之: 1)我在nginx文件中没有这个语句:
daemon = off;
2)我正在使用上面的runit脚本,但它总是创建一个新的PID。
那么......确保nginx始终运行的最佳做法是什么。
顺便说一句,我正在使用monit,但是会跑到自己的hte守护进程。
作为测试,我确实使用killall -9 nginx杀死了nginx,我做了一个ps aux | grep nginx并注意到我得到了新的pid。那么......我还需要runit吗?
答案 0 :(得分:2)
/etc/init.d
下的脚本与sysvinit相关联,这是一种令人尊敬且不幸的相当破坏的UNIX服务管理方法。请参阅UNIX下的进程形成树:每个进程都有一个父进程,即启动它的进程。父母对子女有很多控制权,重要的是在子进程死亡时得到通知。如果你是它的父母,保持一个进程运行或关闭它几乎是微不足道的。
并且存在问题:sysvinit服务脚本启动服务然后退出,使服务保持运行。服务的父进程消失了,这使得很难找到并跟踪服务 - 当要求sysvinit脚本停止服务时,它需要使用不可靠的信息确定应该停止哪个进程
在正确的服务管理方法中,如在runit和daemontools中使用的那样,服务由监督进程运行,在启动服务后坚持。由于该服务是子进程,因此管理程序进程知道它是否正在运行,是否已崩溃,以及在哪里找到它以发送信号。
所以在runit脚本中,正确的做法是运行nginx本身,而不是init.d脚本。这很容易做到。但是,默认情况下,nginx守护自身,这意味着它故意从其父进程“逃脱”并变得非常难以跟踪。幸运的是,可以关闭该行为,这是daemon off;
配置选项的目的。因此,nginx的有效runit脚本如下所示:
#!/bin/sh
exec /usr/sbin/nginx -g "daemon off;"
短而甜蜜。 runit可以很好地管理这个安排 - 它会让nginx保持运行,你可以用sv
来控制它。例如,sv hup nginx
告诉nginx重新加载其配置。当然,如果nginx崩溃并重新启动,或者你故意要求它重新启动sv restart nginx
,PID将会改变,但是runit会处理这个问题。
答案 1 :(得分:-4)
Nginx有一个管理工作进程的主进程。它一直在运行。通过让nginx在前台运行并让其他应用程序管理很难重新发明轮子。