Supervisor是一个多进程管理工具,在python生产环境中使用很频繁。它是由python实现的,在github上可以找到它的源码。
在目前的使用中,个人觉得最重要的就是同时启动多个应用,至于在网上看到的其他人说所的,在程序crash之后会自动重启,这是它有的功能不过在真实使用中还没碰到程序crash的情况。
常见的情景是这样,用supervisor启动多个django或者tornado程序,分别监听在不同的端口上。然后前面用一个nginx打到这几个端口。这样你访问监听在80端口的nginx的时候其实访问的是后面的几个django或者tornado程序,至于这样算不算是负载均衡,目前the5fire还没有搞清楚。不管怎样吧,这个东西就是这么用的。
下面就来具体说下supervisor的安装和配置(我是ubuntu12.04环境)。
首先,shell下命令:
代码语言:javascript复制mkvirtualenv super
cd ~/.virtualenvs/super
这段命令的作用是创建一个虚拟环境super,然后跳到这个目录下。不了解内情的到这里先补下基础:《使用virtualenv创建虚拟python环境》
然后就是安装supervisor以及django:pip install supervisor django。
好,现在环境就初始化好了,先在super环境的etc下创建一个django项目,命名为sayhello:django-admin.py startproject sayhello。
然后就是配置supervisor的配置文件了。
根据官方指示,要执行下名的命令来创建配置文件:
echo_supervisord_conf > etc/supervisord.conf
但是在一开始接触的时候,标准配置文件中的东西实在是太多,不如把程序给弄起来先。因此我的配置文件是这样的:
代码语言:javascript复制[unix_http_server]
file=~/.virtualenvs/super/tmp/supervisor.sock ; path to your socket file
chmod=0777 ; socket file mode (default 0700)
sockchown=root:the5fire ; socket file uid:gid owner
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
[supervisord]
logfile=~/.virtualenvs/super/tmp/supervisord.log ; supervisord log file
logfile_maxbytes=50MB ; maximum size of logfile before rotation
logfile_backups=10 ; number of backed up logfiles
loglevel=debug ; info, debug, warn, trace
pidfile=~/.virtualenvs/super/tmp/supervisord.pid ; pidfile location
nodaemon=false ; run supervisord as a daemon
minfds=1024 ; number of startup file descriptors
minprocs=200 ; number of process descriptors
#user=root ; default user
#childlogdir=~/.virtualenvs/super/logs
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix://~/.virtualenvs/super/tmp/supervisor.sock ; use a unix:// URL for a unix socket
username=user
password=123
[program:sayhello]
command=/home/the5fire/.virtualenvs/super/bin/python /home/the5fire/.virtualenvs/super/etc/sayhello/manage.py runserver 800%(process_num)1d --noreload
process_name=%(program_name)s_%(process_num)d
autostart=true
stdout_logfile= ~/.virtualenvs/super/logs/supervisord_stdout_%(process_num)02d.log
numprocs=2
numprocs_start=0
各个参数的意思都很明确,其中有几个需要着重解释下,在配置的过程中the5fire卡壳在这里。
一开始的时候设置sock文件的拥有者的时候用:chown=root:the5fire,启动失败,安居提示修改为:sockchown=root:the5fire方成功,貌似the5fire:the5fire也可以,看文档说是用户和用户组。
后面还有一点要说明的就是端口的配置,在[program]配置项中,有两个参数numprocs=2,numprocs_start=0用来配置启动进程数和启动进程号。这样就有一个变量可以使用了:process_num,它就用来表示当前进程号。
在[program]项中还有一个command,就是要执行的程序。
这个配置总的目的是启动前面创建的那个django程序,分别监听在8000和8001端口。