supervisor 分为 客户端和服务端, 这里记录使用supervisor管理gunicorn测试机ubuntu16.04 + python3.6
supuervisor 属于系统级别的直接安装在 虚拟环境之外就可以
主要实现的是在虚拟环境中基于 Flask 框架 搭建一个web 应用,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理进程, 这里我主要记录Supervisor 进行进程管理
1 安装
pip install supervisor
2 生成默认的配置文件 建议放在自建配置目
cd /etc mkdir supervisor cd supervisor echo_supervisord_conf > supervisor.conf # 生成 supervisor 默认配置文件
3 修改配置文件 启动一定指定配置文件绝对路径
vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 进程管理 在 supervisor.conf 配置文件底部添加 [program:myapp] 进程管理名称随便拟定 有时候和项目启动脚本重复时 会出现Bug command=/home/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:8080 app:app ; supervisor启动命令 directory=/home/myproject ; 项目的文件夹路径 startsecs=0 ; 启动时间 stopwaitsecs=0 ; 终止等待时间 autostart=false ; 是否自动启动 autorestart=false ; 是否自动重启 stdout_logfile=/home/myproject/log/gunicorn.log ; log 日志 stderr_logfile=/home/myproject/log/gunicorn.err ; 错误日志
4 配置 web 管理界面
supervisor 还有一个 web 的管理界面,可以激活。更改下配置 客户端 (ctl 表示客户端 **d 表示服务端) [inet_http_server] ; inet (TCP) server disabled by default port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for alliface) username=wang ; (default is no username (open server) 登录客户端的账号 password=123 ; (default is no password (open server)) 登录客户端的密码 随便拟定 服务端与下面客户端配置必须一致 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket username=wang ; should be same as http_username if set password=123 ; should be same as http_password if set ;prompt=mysupervisor ; cmd line prompt (default "supervisor") ;history_file=~/.sc_history ; use readline history if available
5 启动服务
supervisord -c /etc/supervisor/supervisord.conf 启动 同时启动的客户端和服务端 进入客户端 supervisorctl -c /etc/supervisor/supervisord.conf 1 基本操作 help status 察看supervisor的状态 reload 重新载入 配置文件 start [all]|[appname] 启动指定/所有 supervisor管理的程序进程 stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程 2 直接操作 supervisorctl -c /etc/supervisor/supervisord.conf status 察看supervisor的状态 supervisorctl -c /etc/supervisor/supervisord.conf reload 重新载入 配置文件 supervisorctl -c /etc/supervisor/supervisord.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程 supervisorctl -c supervisor.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程
注意事项:
1. 先确认[program:XXX]中自己的程序的command=<启动命令>和 directory=<运行命令的路径>没有问题,python是不是用的自己要的环境的python(比如虚拟环境的),log文件的文件夹是不是已经创建(没创建的话supervisor没权限生成log文件),以及改log文件是不是授权给所有用户了(可参考前面的解决办法chmod +x aaaaa.log)
2. 确保用上面的配置中的command在指定路径可以直接运行不会报错,这时候一般就不会有什么问题了。这时候tail你自己的log文件一般就能看到log信息,启动失败报错的信息也会在你的log文件中,照着解决后supervisorctl reload就好了。
3. 如果上面的命令确保可以跑,但还是没法正常运行,也看不到自己程序的报错(不然你就能根据报错解决问题了),那么恭喜,你遇到了跟我一样的情况。我的解决办法很诡异,尝试把[program:XXX]中的名字换成了一个跟启动命令不一样的另一个名字(不要太短),reload之后居然就可以跑了
参考: