简介
python 的部署一直是个问题,不过现在已经2018年了,成熟的方案很多。比较常用的就是 nginx + upervisor + virtualenv + gunicorn / uwsgi 。
好处就是可以很方便控制程序启动/停止/重启,尤其你有很多的服务的时候;但滥用重启就是另一个问题了,给方便不见得就是希望你滥用。
分为两个部分:
supervisord: 服务端
supervisorctl: 客户端
client 和 server 通讯可以配置 socket 还是 http,如果是单机的话不用管这个配置,如下:
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;
多机的话最好配置http 方式通讯,如下:
[supervisorctl]
serverurl=http://127.0.0.1:9001 ;
安装
pip install supervisor
注意:目前 supervisor 不支持 python3,只能用 python2,但不影响其控制python3 的服务甚至是Java PHP的服务。
配置
sudo mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
配置文件解释
[program:工程名称]
command=python3 run.py; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
配置实例
假设我有个 python server,比如 flask 和 celery。
[program:celery]
command=celery -A application.celery worker -c 6 --beat -l info
directory=/home/rd/username/X_server/
autostart=true
autorestart=true
stopsignal=KILL
redirect_stderr=true
priority=1
stopasgroup=true
killasgroup=true
[program: X_server]
command=gunicorn -b 0.0.0.0:5000 -w 4 run:app info --error-logfile logs/error.log --log-file logs/app.log --access-logfile logs/access.log
directory=/home/rd/username/X_server/
autostart=true
autorestart=true
stopsignal=KILL
priority=10
redirect_stderr=true
这里配置priority,可以保证先启动celery,再启动 X_server。
启动
python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
操作
启动/停止/重启,"all" 代表所有服务。
supervisorctl start celery
supervisorctl stop celery
supervisorctl restart celery
supervisorctl start X_server
supervisorctl stop X_server
supervisorctl restart X_server
supervisorctl restart all
WEB 管理页
一般用不到,不过如果服务特别多的话就是另一回事了,修改配置如下:
[inet_http_server]
port=0.0.0.0:9001 ; ip & port 默认9001,占用了就改下
username=user
password=123 ; 默认都没用户名和密码,需要就加上
然后访问 9001 端口即可。
网友评论