supervisor和gunicorn问题记录

本文最后更新于2018年5月19日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=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

gunicorn的坑:
  • IOError(2, ‘No such file or directory’)

  • gunicorn.errors.HaltServer: <HaltServer ‘Worker failed to boot.’ 3>

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3929.html

《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

发表评论

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