Supervisor&Gunicorn托管Flask项目

1 环境需求

  • Ubuntu18.04
  • pip19.1.1
  • virtualenv16.2.0
  • Flask1.0.2
  • Gunicorn19.9.0
  • Supervisor3.2.0

2 环境部署

2.1Ubuntu环境部署

pip是python包管理器,用于安装python库,该工具使用全局安装,一次安装,多虚席环境公用,和python样,有两个版本:2.x和3.x,安装方式如下:
【pip安装】

sudo apt-get install python-pip
sudo apt-get install pyhton3-pip

【查看版本】

pip -V
pip3 -V

2.2 viurtualenv部署

virtualenv是python虚拟环境管理器,功能与AnacondaDocker功能类似,均提供独立的运行环境,参考博客:Ubuntu部署Anaconda环境及conda使用,使用全局安装,供多用户使用。
【virtualenv安装】

sudo apt-get install virtualenv

【新建指定py版本虚拟环境】

virtualenv -p /usr/bin/python2 py2env
virtualenv -p /usr/bin/python3 py3env

【激活虚拟环境】

cd 新建虚拟环境的路径
source py2env/bin/activate
source py3env/bin/activate

【停用虚拟环境】

deactivate

【修改虚拟环境用户】

# 进入虚拟环境文件夹
cd py2env
cd py3env
# 修改该文件夹的用户为当前用户
# 这样就可以直接pip安装文件
# 如果用sudo是全局安装,不是在虚拟环境安装
sudo chown xindq -R *
sudo chown xindq -R *

2.3 Flask部署

Flask是python版的轻量级web框架,易于上手,可满足开发需求,若不满足,移步其他框架或语言。
【安装】

(py2env)pip install flask
(py2env)pip install flask

【框架】

from flask import Flask
app = Flask(__name__)

@app.route('/api', methods=[GET,POST])
def api():
	return 'Api test!'
if __name__ == '__main__':
	app.run(host='0.0.0.0', port=8080, debug=True)

【运行】

(py2env)python app.py
(py3env)python app.py

【访问】

http://127.0.0.1:8080/api

2.4 gunicorn部署

gunicorn是python线程进程监控器,监就是监视python后台程序运行,flask虽是web框架,但他是python开发。控即控制python程序进程的分配,python的弱点是不能启动多进程,所以有了其他辅助。
【安装】

(py2env)pip install gunicorn
(py3env)pip install gunicorn

【配置:分配进程资源并启动】

gunicorn -w 4 -b [inetIP]:[port] [fileName]:[serverName]
w:gunicorn开启的进程数;
b:绑定服务地址及端口;
inetIP:内网IP;
port:绑定运行端口;
fileName:需要监控的py文件(包含运行的服务);
serverName:服务的名称;

【查看内网地址】

ifconfig

【例子】

#输入,即可运行app服务
gunicorn -w 4 -b 127.0.0.1:8080 chatbot:app

【chatbot.py】

from flask imprort Flask
app = Falsk(__name__)
@app.route('/connect', methods=[GET])
	return 'Service is runing...'
if __name__ == '__main__':
	app.run(host='0.0.0.0', port=8080, debug=True)

2.5 supervisor部署

supervisor是python进程监控器,实现python程序的监视和控制,这里的控制就是对python进程的启动,停止和重启,实现自动化运行python的web服务。
【安装】

#python2环境
sudo apt-get install supervisor

【配置supervisord.conf】

sudo vim /etc/supervisor/supervisord.conf
; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run//supervisor.sock ; use a unix:// URL  for a unix socket
; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.
[include]
;单个程序
files = /etc/supervisor/conf.d/chatbot.conf
;多个程序,同时写入conf.d文件夹中
;如有chatbot和face_recognition两个程序
;程序设计如下
;chatbot.conf和face_recognition.conf
files = /etc/supervisor/conf.d/*.conf
;注意,python中的文件后缀,可以更改
;经验:A用py2,B用py3
;使用的conf不兼容
;有后缀隔离自己配置:如*.ini, *.txt
;supervisor控制台
[inet_http_server]
# 监听的IP,形式为host:port
# 若port = *:8080报错,则使用0.0.0.0:8080
port=*:8080
username=xindaqi
password=123456

【配置程序文件chatbot.conf】

sudo vim /etc/supervisor/conf.d/chatbot.conf
# chabot为服务文件名称:chatbot.py
[program:chatbot]
#执行gunicorn命令
command=/sourcePath/py3envinstall/bin/gunicorn -w 4 -b 127.0.0.1:8080 chatbot:app
directory=/sourcePath
#必须添加用户
user=xindq
#自动启动
autostart=true
#自动重启
autorestart=true
#日志
stdout_logfile=/sourcePath/logs/gunicorn_supervisor.log

【supervisor手动启用】

# 关闭所有supervisord
sudo killall supervisord
#进入/etc/supervisor目录
#手动启动服务
sudo supervisord -c supervisord.conf
#查看supervisor状态
sudo supervisordctl -c supervisord.conf status
#重新载入
sudo supervisorctl -c supervisord.conf reload
#开启服务
supervisorctl -c supervisord.conf start 
#关闭服务
supervisorctl -c supervisord.conf stop

【supervisor自动启用】

#重新载入
sudo supervisorctl reload
#启动
sudo service supervisor start
#重启
sudo service supervisor restart
#查看supervisor当前状态
sudo supervisorctl
#启动app
start app
#停用app
stop app

3 测试

#启动supervisor
sudo supervisord -c supervisord.conf
#查看状态
sudo supervisorctl
#启动app
start app
#启动Postman测试
# 查看supervisor状态
0.0.0.0:8080

【supervisor登录】
login

图3.1 supervisor登录

【supervisor监控界面】

supervisorstatus

图3.2 supervisor监控界面

4 安装supervisor问题总结

【Question1】

$ sudo supervisorctl reload
$ sudo supervisord -c supervisord.conf
error: <class 'socket.error'>, [Errno 111] Connection refused: file: /usr/lib/python2.7/socket.py line: 228
$ sudo supervisorctl
unix:///var/run/supervisor.sock no such file
$ sudo supervisorctl
unix:///var/run/supervisor.sock refused connection

【Reason】
supervisor.sock的权限问题和文件所属分组问题。在/var/run/新建supervisor.sock,查看权限:

ll supervisor.sock
-rwxrwxrwx 1 root root 0 Jan 24 19:41 supervisor.sock*

由以上结果可以看出,supervisor.sock第一个位置是横线-,表示
文件类型,因为该文件类型为socket文件,所以文件全新第一位置应该为s

  • Solve
    新建supervisor.sock,使用命令:
    sudo touch supervisor.sock

【Question2】

app     FATAL   Exited too quickly (process log may have details)
app: ERROR (spawn error)

【Reason】
未在虚拟环境下启动app。
【Solve】
在虚拟环境下启动app。

source py3env/bin/activate
sudo supervisorctl
start app

[参考文献]
[1]https://blog.csdn.net/cecurio/article/details/78058606
[2]https://blog.csdn.net/w1014074794/article/details/51881050


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值