Flask应用部署与运维
WSGI
WSGI简介
- WSGI(Python Web Server Gateway Interface)
- 定义了Web服务器和Web应用程序之间通信的接口规范。
WSGI应用
-
WSGI 应用是一个接受两个参数的可调用对象。
-
两个参数
- environ 参数是个字典对象,包含 CGI 风格的环境变量。
- start_response 参数是一个接受两个固定参数和一个可选参数的可调用者。
WSGI服务器
- WSGI 服务器为每一个HTTP请求,调用WSGI应用。
- 简单的服务器实现(在python标准库中)
wsgiref — WSGI Utilities and Reference Implementation
例程:
# wsgi app
def application(environ,start_response):
response_body = "<h1>Hello World</h1>"
header = [('Content-Type','text/html')]
status = "200 OK"
start_response(status,header)
print("environ http request method:"+environ['REQUEST_METHOD'])
return [response_body.encode('utf8')]
if __name__ == '__main__':
from wsgiref.simple_server import make_server
httpd = make_server("0.0.0.0",8081,application)
print("httpd run on:"+str(httpd.server_port))
httpd.serve_forever()
通过Advanced REST client测试
部署方案设计
服务器系统的选择
Centos与Ubuntu
常用WSGI服务器
- Gunicorn
- uWSGI
- CherryPy
- Tornado
- Gevent
Web服务器
Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。
部署工具的安装与使用
- Virtualenv简介
用于创建独立的python运行环境,解决版本问题,依赖问题,权限问题。 - Virtualenv安装与使用
sudo pip3 install virtualenv
创建虚拟环境,激活虚拟环境,激活虚拟环境(类似anaconda)
virtualenv venv 创建环境
source venv/bin/activate 进入环境
pip3 install flask 在该环境下可以不用sudo
python3 需要运行的.py代码
deactivate 退出环境
- Supervisor简介
- python_道无涯的文章:ubuntu18+Supervisor+python3的使用
进程管理工具,功能有应用程序进程的控制,多应用进程的管理,应用中断后的快速恢复。
- Supervisor安装与使用
sudo apt-get install supervisor
在/etc/supervisor下有supervisord.conf配置文件
在conf.d文件夹克配置自定义的进程启动的*.conf
文件
笔者配置了一个virtest.conf文件
[program:virtest2]
command = python3 /home/tarena/tarena_home/16virtualenv/virtest2.py
directory=/home/tarena/tarena_home/16virtualenv
sudo /etc/init.d/supervisor start
启动supervisor
返回[ ok ] Starting supervisor (via systemctl): supervisor.service.
为开启成功
sudo service supervisor start/stop
启动/停止程序
用于添加程序,并使用supervisorctl进行控制
sudo supervisorctl
能查看和控制程序运行态
返回
virtest RUNNING pid 11780, uptime 0:00:08
virtest2 RUNNING pid 11779, uptime 0:00:08
用curl 127.0.0.1:8081
命令可以测试是否有信息返回
Flask应用部署
部署工具的安装和配置
sudo apt-get install mongodb-server
sudo apt-get install nginx
在工程文件夹中创建一个requirements.txt文件,包含以下内容
flask
flask-wtf
flask-script
pymongo==3.9.0
flask-mongoengine
gunicorn
virtualenv venv
创建虚拟环境
source venv/bin/activate
进入环境
pip3 install -r requirements.txt
在该环境中国安装所需库
当所在的虚拟环境中有可执行Flask代码时,可执行
gunicorn -b 0.0.0.0:8083 run:app
应用使用了工厂方法,所以只在run.py文件中创建了应用对象app,gunicorn命令的参数必须是应用对象,所以这里是”run:app”
现在就可以通过”http://127.0.0.1:8083″来访问应用,监听端口是8083。
部署应用
在/etc/nginx
下的sites-available为可用的配置文件, sites-enabled为生效的配置文件。可在sites-available创建自定配置文件,在sites-enabled创建自定义文件软连接。
如在sites-available下创建一个todo_app,内容如下
server {
listen 80;
location /static {
alias /home/shin/Todo/app/static;
}
location / {
proxy_pass http://127.0.0.1:9000;
}
}
然后到sites-enabled文件夹下,创建软连接
sudo ln -s ../sites-available/todo_app .
接着可重启nginx,sudo service nginx reload
假如nginx启动错误,应去查看错误日志,nginx.conf是绝对错误日志路径的文件,可在此查看。/var/log/nginx/error.log
nginx结束后继续到/etc/supervisor/conf.d中建文件todo.conf,sudo vim todo.conf
。内容如下:nginx监测的80端口,会转到9000上
[program:todo]
command = /home/shin/Todo/venv/bin/gunicorn -b 127.0.0.1:9000 run:app
directory = /home/sbin/Tode
然后进入supervisorctl控制台,sudo supervisorctl
查看运行情况。用reload重新加载配置文件,status查看状态。
最后就能直接通过IP来访问。
轻量级运维方案的设计与实现
DevOps(Development和Operations的组合)
用于促进软件开发过程中,开发部门,技术运营,质量保证部门的快速开发和协作。让大家能快速协调开发过程中的问题。
- DevOps优点:自动化,快速发布,快速恢复。
Fabric
一个通过SSH进行应用部署以及系统任务管理的命令行工具。
功能:在本地或者远程执行shell命令,上传和下载文件,提示用户输入,中断操作。
轻量级运维方案的设计
在本地进行代码操作,把写好的最新代码push发送到gitlab上,再通过Fabric让appServer服务器自己从gitlab获取最新代码,并执行。
通过sudo pip3 install fabric
安装fabric应用
- Python之禅的文章:远程部署神器 Fabric,支持 Python3
在项目文件下创建fabfile.py文件,内容如下:
from fabric import Connection
# env.hosts = ['192.168.1.108']
# env.user = 'shin'
# env.password = '123456'
def hello():
print("hello world")
def deploy():
c = Connection("shin@192.168.1.108",connect_kwargs={"password":"123456"})
with c.cd('/home/shin/Todo'):
c.run('git pull')
c.sudo('supervisorctl restart todo')
c.sudo('supervisorctl status')
然后直接python3 fabfile.py,最新代码就已经部署到正式环境并重启了服务。
这样每次开发的改动,就能快速部署到我们服务器上了。