确保nginx主进程保持运行

问题描述:

我目前正在尝试使用ubuntu:14.04作为基础映像,使用nginx和gunicorn/django/celery运行里面的docker容器。我正在使用主管开始所有的流程,并进行了测试以确保gunicorn在发生故障时重新启动。但是,我无法弄清楚如何用nginx做到这一点。确保nginx主进程保持运行

我对Nginx的supervisord.conf如下:

[program:nginx] 
command=nginx 
autorestart=false 

我已经自动重新启动设置为false,因为从我所知道的,Nginx的命令只启动主进程和工作进程,然后退出状态码为0.如果我将autorestart设置为true,它只是不断尝试重新启动该nginx命令,由于主/从进程已经在运行并绑定到端口,所以后续重试会失败。

从表面上看,这似乎没问题,因为如果我尝试杀死一个工作进程,那么主服务器会启动另一个工作人员来处理它。但是,我如何确保主进程保持运行?

+0

我不知道我理解的问题,但你不能使用monit的呢? – JustMichael

+0

你能分享你的Dockerfile吗? – christian

您需要将daemon off;附加到您的nginx.conf配置中,指示nginx在前台运行。

然后修改你的上级节是:

[program:nginx] 
command=nginx 
autorestart=true 

它仍然会产卵主/工作进程/子过程,可以用这样的方式在生产准备就好了。在这种情况下,主管会在后台运行该流程并对其进行控制并进行监督。

看到这个FAQ entry

+1

谢谢詹姆斯,这听起来像是会起作用!只是为了确保我理解当我进行更改时应该看到的内容,如果我在docker上运行ps -ef,我应该看到nginx行,主进程行和工作进程行是否正确?即使有守护进程,我仍然因为某种原因得不到这个结果;作为我的配置中的第一条(非注释)行。我仍然只有主人和工人。当我杀死主人时,主人不会重新启动,所以只有工人继续工作。我甚至尝试向主管conf添加“killasgroup = true”选项。有什么想法吗? –

+0

这是一个非常好的问题;由于我对nginx'x内部流程管理不熟悉,因此我必须仔细研究它。 –

+0

对不起,澄清,用你推荐设置,supervisor.log所示: '2015年6月15日13:37:53177 INFO催生:具有pid 16' PS '的nginx' -ef表示: '根部16 1 0 13:37? 00:00:00 nginx:主进程nginx' 如果我'kill -9 16',主人死亡和工作人员保持运行。主管是否尝试重新运行'nginx'根据您的设置,但不断抱怨: '绑定()到0.0.0.0:80失败(98:地址已在使用中)' 我认为我应该强迫工人死亡主人,但“killasgroup =真”似乎并没有完成那件事。有什么建议么?我错过了什么吗? –