=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
参考链接:
- https://stackoverflow.com/questions/18859063/supervisor-socket-error-issue
- http://pycode.cc/supervisor-socket-error/
- https://github.com/Supervisor/supervisor/issues/121
- https://www.jianshu.com/p/687f0956081c
- https://www.gznotes.com/supervisor-socket-error-errno-101/
- =
- https://stackoverflow.com/questions/24639907/gunicorn-errors-haltserver-haltserver-worker-failed-to-boot-3/30486771#30486771
=END=
《 “supervisor和gunicorn问题记录” 》 有 4 条评论
实现「进程监控」可以使用的一些工具(Bluepill、eye、god、supervisor、Open-Falcon)
Process monitoring tool. Inspired from Bluepill and God. (Ruby)
https://github.com/kostya/eye
simple process monitoring tool (Ruby)
https://github.com/bluepill-rb/bluepill
Ruby process monitor
https://github.com/mojombo/god
http://godrb.com/
Open-Falcon
http://book.open-falcon.org/zh/usage/proc-port-monitor.html
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比较类似。
`
生产级部署 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
`
使用supervisor设置服务端frp开机启动
https://www.92ez.com/?action=show&id=23484
https://github.com/fatedier/frp