flask + supervisor + gunicorn

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

flask + supervisor + gunicornflask + supervisor + gunicorn

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之后居然就可以跑了

 参考:

https://www.jianshu.com/p/be9dd421fb8d

https://blog.csdn.net/kkevinyang/article/details/80539940

相关推荐