前面写的Celery文章都是在开发环境中测试。可以发现为了运行Django+Celery+Redis这一套程序,需要打开好几个窗口:Redis服务、Celery worker、Celery beat和Django服务器。然而在生产环境即服务器,肯定不能这么处理。我们需要这些进程在后台中运行(也叫守护进程或者daemonize模式)。
这里借助Supervisor进行管理程序,将非后台运行的程序变成后台运行。包括Redis也可以丢给Supervisor管理。
相关的代码也上传到Github:https://github.com/HaddyYang/django-celery-redis-simple
1、安装Supervisor
Supervisor是Python开发的,用于在Linux服务器中管理进程。
除了可以讲上面转换程序为后台程序之外,还可以监控进程。若进程崩溃关闭,它可以自动重启进程等等。更多相关介绍可以查看Supervior的官网:http://supervisord.org。
Supervisor安装很简单,使用pip即可安装:
pip install supervisor
目前我安装使用的版本是3.3.1。安装完成之后多了3个命令:echo_supervisord_conf、supervisorctl和supervisord。这3个命令下面都会使用到。
2、Supervisor配置
我们可以使用echo_supervisord_conf命令得到supervisor配置模板,打开终端执行如下Linux shell命令:
echo_supervisord_conf > supervisord.conf
该命令输出文件到当前目录下(当然,你也可以指定绝对路径到具体位置),文件名为supervisord.conf。
再使用vim命令打开该文件并编辑:
vim supervisord.conf
相关的配置信息该文件都有写明,只不过都是英文。别担心,下面开始讲解如何配置。
直接把光标移动到文件底部。vim的使用自行搜索。主要使用如下:
1)输入i开启编辑;
2)输入esc退出编辑进入命令模式;
3)命令模式输入:wq保存并退出;
4)命令模式输入:q!不保存强制退出。
新行输入如下配置信息(以celery worker为例,具体含义看注释):
[program:celery.worker] ;指定运行目录 directory=/home/xxx/webapps/yshblog_app/yshblog ;运行目录下执行命令 command=celery -A yshblog worker --loglevel info --logfile celery_worker.log ;启动设置 numprocs=1 ;进程数 autostart=true ;当supervisor启动时,程序将会自动启动 autorestart=true ;自动重启 ;停止信号,默认TERM ;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐) ;终止:TERM (kill -TERM pid) ;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同 ;从容停止:QUIT (kill -QUIT pid) stopsignal=INT
其中第一行是必须的,设置该程序的名称(可自行修改,不要和其他program重复)。
这里没提到的参数配置不是必须的,可以参考Supervisor的官网。
还需说明日志的问题。原本我设置了日志配置,而不是通过celery命令设置--logfile参数:
;输出日志 stdout_logfile=celery_worker.log stdout_logfile_maxbytes=10MB ;默认最大50M stdout_logfile_backups=10 ;日志文件备份数,默认为10 ;错误日志 redirect_stderr=false ;为true表示禁止监听错误 stderr_logfile=celery_worker_err.log stderr_logfile_maxbytes=10MB stderr_logfile_backups=10
可能是celery版本(3.1.25)的缘故,无法显示全部的日志内容。而且日志内容被写入两个文件celery_worker.log和celery_worker_err.log中,显得冗余。所以改为celery命令设置--logfile参数。
另外,在celery.worker下设置celery.beat定时任务的进程:
[program:celery.beat] ;指定运行目录 directory=/home/xxx/webapps/yshblog_app/yshblog ;运行目录下执行命令 command=celery -A yshblog worker --loglevel info --logfile celery_beat.log ;启动设置 numprocs=1 ;进程数 autostart=true ;当supervisor启动时,程序将会自动启动 autorestart=true ;自动重启 ;停止信号 stopsignal=INT
你也可以把redis添加进来,给supervisor管理。将redis配置写在celery.worker前面。先打开redis服务,再执行celery.worker,最后轮到celery.beat。如下redis配置:
[program:redis] ;指定运行目录 directory=~/webapps/yshblog_app/lib/redis-3.2.8/ ;执行命令(redis-server redis配置文件路径) command=redis-server redis.conf ;启动设置 numprocs=1 ;进程数 autostart=true ;当supervisor启动时,程序将会自动启动 autorestart=true ;自动重启 ;停止信号 stopsignal=INT
3、启动和关闭Supervisor
启动supervisor输入如下命令,使用具体的配置文件执行:
supervisord -c supervisord.conf
关闭supervisord需要通过supervisor的控制器:
supervisorctl -c supervisord.conf shutdown
重启supervisord也是通过supervisor的控制器:
supervisorctl -c supervisord.conf reload
这些可以保存为shell脚本,并赋予执行权限方便管理。当然,平常也可以进入supervisor控制器,输入命令supervisorctl即可。再输入help得到相关帮助: