Gunicorn同步工人产卵过程

时间:2015-08-31 05:08:12

标签: django fork gunicorn

我们在服务器中使用Django + Gunicorn + Nginx。问题是,经过一段时间后,我们看到很多枪手工人流程已经变成了孤儿,还有很多其他人变成了僵尸。我们还可以看到一些Gunicorn工人进程产生了一些其他的Gunicorn工人。我们最好的猜测是,这些工人在其父母工人去世后成为孤儿 为什么Gunicorn工人会产生童工?他们为什么要死?!我们怎样才能防止这种情况发生? 我还应该提一下,我们已经将Gunicorn日志级别设置为debug,除了工作人员编号的定期日志之外,我们仍然没有看到任何重要的事情,报告了我们想要的工人数量。

更新 这就是我们用来操作gunicorn的路线:

gunicorn --env DJANGO_SETTINGS_MODULE=proj.settings proj.wsgi --name proj --workers 10 --user proj --group proj --bind 127.0.0.1:7003 --log-level=debug --pid gunicorn.pid --timeout 600 --access-logfile /home/proj/access.log --error-logfile /home/proj/error.log

3 个答案:

答案 0 :(得分:1)

我们将使用.sh文件启动gunicorn进程。稍后,您将使用受监管的配置文件。 what is supervisord?一些外部专家知道如何通过Django,Nginx,Gunicorn Here

链接有关如何安装超级用户的信息。

gunicorn_start.sh记得给文件添加chmod + x。

#!/bin/sh
NAME="myDjango"
DJANGODIR="/var/www/html/myDjango"
NUM_WORKERS=3
echo "Starting myDjango -- Django Application"
cd $DJANGODIR
exec gunicorn -w $NUM_WORKERS $NAME.wsgi:application --bind 127.0.0.1:8001

mydjango_django.conf:请记住在您的操作系统上安装超级用户。和 将其复制到配置文件夹中。

[program:myDjango]
command=/var/www/html/myDjango/gunicorn_start.sh
user=root
autorestart=true
redirect_sderr=true

以后使用命令:

重新加载守护程序的配置文件,而无需添加/删除(不重新启动)

supervisordctl reread

重新启动所有进程注意:重新启动不会重新读取配置文件。为此,请参阅重读和更新。

supervisordctl start all

获取所有流程状态信息。

supervisordctl status 

答案 1 :(得分:0)

在我的情况下,我部署在Ubuntu服务器(LTS版本,现在几乎是14.04 LTS服务器),我从未遇到过gunicorn守护进程的问题,我创建了一个gunicorn.conf.py并使用此配置从upstart启动gunicorn /etc/init/djangoapp.conf

中的脚本
description "djangoapp website"
start on startup
stop on shutdown
respawn
respawn limit 10 5

script
  cd /home/web/djangoapp
  exec /home/web/djangoapp/bin/gunicorn -c gunicorn.conf.py -u web -g web djangoapp.wsgi
end script

我使用.py文件配置配置gunicorn并设置一些选项(详情如下)并在virtualenv中部署我的应用程序(带/home/web/djangoapp),并且僵尸和孤儿枪支进程没有任何问题。< / p>

我验证了你的选项,超时可能是一个问题,但另一个是你没有在配置中设置max-requests,默认为0,所以,你的守护进程中没有自动工作器重启并且可能产生内存泄漏( http://gunicorn-docs.readthedocs.org/en/latest/settings.html#max-requests

答案 2 :(得分:0)

这听起来像是超时问题。

您有多个超时,所有超时都需要降序排列。看来可能不是。

例如:

  • Nginx的默认超时为60秒
  • Gunicorn的默认超时时间为30秒
  • Django的默认超时为300秒
  • Postgres的默认超时很复杂,但在本示例中,我们将其设置为60秒。

在此示例中,当30秒过去并且Django仍在等待Postgres响应时。 Gunicorn告诉Django停止,这又应该告诉Postgres停止。在杀死django之前,Gunicorn将等待一段时间,直到完成后,postgres进程才成为孤立查询。用户将重新启动他们的查询,这一次查询将花费更长的时间,因为旧的查询仍在运行。

我发现您已将Gunicorn领带设置为300秒。

这可能意味着Nginx告诉Gunicorn在60秒后停止,Gunicorn可能等待Django等待Postgres或任何其他基础进程,并且当Nginx厌倦了等待时,它将杀死Gunicorn,使Django挂起。 >

这仍然只是一个理论,但这是一个非常普遍的问题,希望可以将您和其他遇到类似问题的人带到正确的地方。