前后端项目部署-2, flask+Gunicorn+gevent,docker部署,
####
部署方案flask+Gunicorn+gevent
每个组件的作用:
1,. gunicorn:高性能WSGI服务器;
Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。
和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。
目前Gunicorn只能运行在Linux环境中,不支持windows平台
部署 Flask 应用时,为什么会需要 gunicorn 或 uWSGI?
简单说就是 Flask自带的wsgi性能低下
只适合你开发调试的时候用,
线上你必须用Gunicorn+Nginx才能获得更强的性能,和更高的安全性
下面我说一些废话:
django、flask 都有自带的http server,
仅仅是方便我们开发的时候调试代码而已
这些开源框架的维护者不可能投入大量精力来优化自带的wsgi服务器,
他们需要把更多的精力投入到框架自身的优化中,
因为服务器方面已经有Gunicorn/uWSGI、nginx等优秀的开源解决方案
假设我们用自带的来部署到线上,会有什么问题呢?
性能很差,差到不好意思出门见人(如果你的网站就几十个人访问,那性能应该问题不大)
最后我个人建议的方案是 flask+Gunicorn+gevent+supervisor+nginx
所以说为什么使用Gunicorn,简单点就是为了并发。利用异步,提高性能。
2. gevent:把Python同步代码变成异步协程的库;
gevent:gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好,我们很方便地顺手套一个gevent来增加并发量
####
第一步,准备一个简单的flask项目,
很简单只需要一个文件,
app.py
from flask import Flask app = Flask(__name__) @app.route('/') def alldata(): return '<h1>Hello World!</h1>' # if __name__ == "__main__": """初始化,debug=True""" app.run(host='0.0.0.0', port=9876, debug=True)
###
第二步,gunicorn 安装,Gevent安装
pip install gunicorn
pip install gevent
###
第三步,在根目录下新建文件 /gunicorn.conf.py
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整 worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量 bind = "0.0.0.0:8888" # 监听IP放宽,以便于Docker之间、Docker和宿主机之间的通信
启动测试
gunicorn start:app -c gunicorn.conf.py
用这种py文件的方式启动是比较简单的,
否则就要用命令行的方式启动,比较麻烦:
gunicorn --workers 3 --bind 0.0.0.0:5000 --user nginx --worker-class gevent start:app
#####
第四步,Dockerfile
FROM python:3.8.5-slim-buster WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
这个地方有一个坑
我之前是FROM python:3.8-alpine3.13
然后报错了,error: command ‘gcc‘ failed with exit status 1
所以看起来,python:3.8-alpine3.13这个包虽然小,但是里面缺少了一些东西,要谨慎使用,
####
第五步构建
完成这两个文件的创建之后,执行如下命令,就可以开始构建Docker镜像:
sudo docker build -t 'testflask' .
构建完成之后,通过如下命令查看镜像列表,可以发现testflask显示在其中:
sudo docker images
####
第六步,运行,
接下来,我们可以push镜像到镜像仓库进行分发,这里我们就在本机运行进行演示。
需要注意,公司的私有代码,不要push到公网的镜像仓库上
运行如下命令,临时运行docker镜像:
sudo docker run -it --rm -p 8888:8888 testflask
#####
#####