uwsgi:为什么每个应用程序加载两个进程?

时间:2013-09-13 10:20:52

标签: python nginx wsgi uwsgi

root@www:~# ps aux | grep uwsgi
root      4660  0.0  0.0  10620   892 pts/1    S+   19:13   0:00 grep --color=auto uwsgi
root     19372  0.0  0.6  51228  6628 ?        Ss   06:41   0:03 uwsgi --master --die-on-term --emperor /var/www/*/uwsgi.ini
root     19373  0.0  0.1  40420  1292 ?        S    06:41   0:03 uwsgi --master --die-on-term --emperor /var/www/*/uwsgi.ini
www-data 19374  0.0  1.9  82640 20236 ?        S    06:41   0:03 /usr/local/bin uwsgi --ini /var/www/app2/uwsgi.ini
www-data 19375  0.0  2.4  95676 25324 ?        S    06:41   0:03 /usr/local/bin uwsgi --ini /var/www/app3/uwsgi.ini
www-data 19385  0.0  2.1  90772 22248 ?        S    06:41   0:03 /usr/local/bin uwsgi --ini /var/www/app2/uwsgi.ini
www-data 19389  0.0  2.0  95676 21244 ?        S    06:41   0:00 /usr/local/bin uwsgi --ini /var/www/app3/uwsgi.ini

以上是uwsgi进程的ps输出。奇怪的是,对于每个ini文件,有两个实例加载 - 即使我有两个uwsgi主人。这是正常的吗?

uwsgi的部署策略是

  • 让皇帝由新贵管理
  • Emperor搜索apps文件夹中的每个uwsgi.ini

uwsgi.conf for upstart:

# simple uWSGI script

description "uwsgi tiny instance"
start on runlevel [2345]
stop on runlevel [06]

exec uwsgi --master --die-on-term --emperor "/var/www/*/uwsgi.ini"

uwsgi.ini (我有两个应用,除app#numbering外,两个应用都有相同的ini):

[uwsgi]
# variables
uid = www-data
gid = www-data
projectname = myproject
projectdomain = www.myproject.com
base = /var/www/app2
# config
enable-threads
protocol = uwsgi
venv = %(base)/
pythonpath = %(base)/
wsgi-file = %(base)/app.wsgi
socket = /tmp/%(projectdomain).sock
logto = %(base)/logs/uwsgi.log

2 个答案:

答案 0 :(得分:3)

您使用--master选项启动它,它生成一个主进程来控制工作程序。

来自官方文档https://uwsgi-docs.readthedocs.org/en/latest/Glossary.html?highlight=master

  

     uWSGI内置的prefork +线程多工作管理模式,通过轻按主开关激活。对于所有实际的服务部署,不使用主模式并不是一个好主意。

你应该阅读http://uwsgi-docs.readthedocs.org/en/latest/Options.html#master 此线程也可能有一些信息给你。 uWSGI: --master with --emperor spawns two emperors

通常不建议一起使用--master和--emperor。

答案 1 :(得分:0)

我对这个主题的猜测是,它应该确实转移到服务器故障。 但是答案就是这样:

你应该两次启动upstart脚本; - )

尝试使用SIGTERM杀死主ROOT进程并查看childs进程是否死亡。 如果您已经运行了两次upstart脚本,那么剩下一个ROOT和两个孩子。