关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
前面写的Celery文章都是在开发环境中测试。可以发现为了运行Django+Celery+Redis这一套程序,需要打开好几个窗口:Redis服务、Celery worker、Celery beat和Django服务器。然而在生产环境即服务器,肯定不能这么处理。我们需要这些进程在后台中运行(也叫守护进程或者daemonize模式)。
这里借助Supervisor进行管理程序,将非后台运行的程序变成后台运行。包括Redis也可以丢给Supervisor管理。
至于,怎么安装和使用Celery、Redis可看Django+Celery+Redis专题。
相关的代码也上传到Github:https://github.com/HaddyYang/django-celery-redis-simple
Supervisor是Python开发的,用于在Linux服务器中管理进程。
除了可以讲上面转换程序为后台程序之外,还可以监控进程。若进程崩溃关闭,它可以自动重启进程等等。更多相关介绍可以查看Supervior的官网:http://supervisord.org。
Supervisor安装很简单,使用pip即可安装:
pip install supervisor
目前我安装使用的版本是3.3.1。安装完成之后多了3个命令:echo_supervisord_conf、supervisorctl和supervisord。这3个命令下面都会使用到。
我们可以使用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
启动supervisor输入如下命令,使用具体的配置文件执行:
supervisord -c supervisord.conf
关闭supervisord需要通过supervisor的控制器:
supervisorctl -c supervisord.conf shutdown
重启supervisord也是通过supervisor的控制器:
supervisorctl -c supervisord.conf reload
这些可以保存为shell脚本,并赋予执行权限方便管理。当然,平常也可以进入supervisor控制器,输入命令supervisorctl即可。再输入help得到相关帮助:
相关专题: Django+Celery+Redis
umberllas@163.com
你好,我的supervisor中include了一些配置文件,却不能生效,找不到原因,能否帮忙看一下 [include] files = /etc/supervisor/conf.d/*.conf
2018-04-17 16:49 回复
umberllas@163.com 回复 杨仕航
感谢😀我用centos6.5+python2.7的yum直接安装的,后来发现这种方式安装的supervisor版本过低,不支持引入文件的写法,装了3.x,就好了
2018-06-15 11:06 回复