supervisor和gunicorn问题记录


=Start=

缘由:

基于Django开发的Web应用在性能上一般比较弱,尤其是直接以命令python manage.py runserver这样启动的,所以一般在线上部署的时候,会在前面加个Nginx做负载均衡(如果可以的话还可以用类似于keepalived做端口/服务健康检查、流量快速切换等高级功能),同时还会用gunicorn调用multiprocessing启动多个Python进程(利用socket文件)监听同一端口,并且为了防止gunicorn进程异常挂掉,还会借助supervisor这个守护进程进行监管。

这里要介绍的就是在这一过程中碰到的和supervisor、gunicorn相关的几个问题,方便以后参考。

正文:

参考解答:
一些前置条件:
  • Python版本(源码安装/yum安装)
  • Python模块(相关文件拷贝/virtualenv重新安装)
supervisor的坑:
  • socket.error, [Errno 111] Connection refused
# 先启动 supervisord
$ supervisord -c supervisor.conf

# 再用 supervisorctl 启动程序
# supervisord和supervisorctl要使用的 supervisor.conf 要一致,否则也会出问题
$ supervisorctl -c supervisor.conf reload
gunicorn的坑:
  • IOError(2, ‘No such file or directory’)
$ /path/to/py27env/bin/gunicorn django_web.wsgi:application -c gunicorn.conf.py
Error: Error: '/var/logs/django_web/error.log' isn't writable [IOError(2, 'No such file or directory')]

$ mkdir -p /var/logs/django_web/
  • gunicorn.errors.HaltServer: <HaltServer ‘Worker failed to boot.’ 3>
$ /path/to/py27env/bin/gunicorn django_web.wsgi:application -c gunicorn.conf.py --log-level=debug

$ /path/to/py27env/bin/gunicorn django_web.wsgi:application -c gunicorn.conf.py --preload

 

参考链接:

=END=

, ,

《“supervisor和gunicorn问题记录”》 有 4 条评论

  1. God进程监控框架
    http://noops.me/?p=133
    `
    监控重启进程的方案有很多种:

    1、最简单的方法,写个脚本fork进程运行,然后waitpid,如果获pid后就再次启动

    2、最土的方法,配置cron任务,固定时间运行脚本检查进程是否存在,不存在则启动

    3、百度使用qmail里的supervised程序,通过supervised监管进程。
    优点:supervised可以启动daemon程序,对于非daemon需要采用nohup的方式启动。
    缺点:每个进程都要配置自己的supervised,无法做到统一管理。
    百度对supervised进行过改造,线上有2个分支,基本功能类似,如:进程挂掉后的重启次数、重启前调用脚本处理、重启时报警功能。

    4、使用supervisord
    supervisord是python写的进程监控工具(http://supervisord.org/),网上也有很详细的中文教程,提供2个工具supervisord和supervisorctl
    supervisord 用来启动supervisord
    supervisorctl start/stop/restart/status [process_name] 对进程进行控制和状态查看
    提供一个http server,能够在浏览器查看和操作进程启停。同时提供xmlrpc功能,可以自己编写CLI程序远程call supervisord的接口
    缺点:不能对daemon程序监控,supervisord退出后会使被监管的进程也退出

    5、使用monit
    monit的功能基本上和supervisord类似,占用内存也非常少,大概在2M左右,不过实在不喜欢它的进程配置语法。
    优点:支持进程资源只用判断,当进程使用cpu/mem超过多少进行重启。当进程异常不断重启时,也支持各种条件。

    6、使用god
    god的功能和supervisord、monit比较类似。
    `

  2. 生产级部署 Python 脚本,日志收集,崩溃自启,一键搞定!
    https://mp.weixin.qq.com/s/0YWNLUoLt3wdIOQ1MKjASQ
    `
    今天介绍一个生产级的流程管理工具 PM2,通常我们说到 PM2 的时候,都是在说如何部署 Node.js 程序,但是实际上 PM2 很强大,不仅仅可以用来管理 Node.js,它还可以用来管理 Python、PHP、Ruby、perl 等等。

    PM2 发展到今天,已经 5 年了,在 Github 上有超过 6500w 次下载,已经成为在生产服务器中运行 Node.js 的首选方式之一。但是它也支持 Python。

    $ pm2 start hello.py
    $ pm2 logs $(app_name)
    $ pm2 install pm2-logrotate
    $ pm2 describe $(app_name)
    $ pm2 stop hello
    $ pm2 restart hello
    $ pm2 delete hello
    $ pm2 startup
    $ pm2 save
    $ pm2 monit
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注