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虚拟环境管理器,功能与Anaconda和Docker功能类似,均提供独立的运行环境,参考博客: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登录】
【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