服务器使用Supervisor后台运行Celery

  • 发布时间:2017年5月9日 01:06
  • 作者:杨仕航

前面写的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


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得到相关帮助:

20170509/20170509010638291.png

上一篇:我的网站搭建(第53天) 定时刷新服务器缓存

下一篇:Django Celery定时任务和时间设置

相关专题: Django+Celery+Redis   

评论列表

umberllas@163.com

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 回复

新的评论

清空