前后端项目部署-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

 

#####

 



#####

posted @ 2021-10-06 05:58  技术改变命运Andy  阅读(407)  评论(0编辑  收藏  举报