简单的方式将Python3,Flask和Docker投入生产

尽管Flask的内置服务器轻巧且易于使用,但它不适用于生产。 默认情况下,Flask集成服务器一次仅服务一个请求。 在开发环境中很好。 运行Web应用程序时,您希望能够处理多个用户和大量请求。 人们会注意到页面和静态文件加载的等待时间很长。

如果您希望在生产中运行Flask,请确保使用可用于生产的Web服务器,例如Nginx,并让您的Python应用由Gunicorn等WSGI应用服务器处理。

为什么这不能更简单? 从了解使用什么开始。 在部署高流量微服务时,我在生产中首次使用Flask进行了艰难的学习。 服务器不断崩溃,因为它无法保持每分钟1,000个请求的速度。 服务器大小无关紧要。 这是不可扩展的。 做了一些研究,发现我需要一个应用服务器。

Application Server接收请求并将信息转换为框架可用的Python对象。 本教程是关于使用uWSGI的。 Web服务器网关接口(WSGI)是Web服务器的简单调用约定,用于将请求转发到以Python编程语言编写的Web应用程序或框架。

Docker生产堆栈

对于我所有工作和娱乐的Web应用程序项目,我都使用Docker。 我已经完成了在Ubuntu VPS上设置Python3,Flask和uWSGI的所有艰苦工作,这并不有趣。 我喜欢使用Docker一次执行的模型,因此您无需再执行一次。

Docker在容器级别而不是VM级别上运行。 避开了所有这些技术,这意味着您可以专注于编写代码,并将配置留给互联网上的其他人。 我的Docker映像安装了捆绑了所有必要配置的Nginx,uWSGI和Flask。将代码编写并打包到此容器中后,可以将其部署到Google Cloud,Azure,AWS或DigitalOcean,而无需担心配置。

文件结构

  -/ app 
-main.py
-requirements.txt
-docker-compose.yml
-Dockerfile
-nginx.sh

步骤1→Basic Flask应用

./app/main.py

 从烧瓶导入烧瓶,蓝图,请求,Responseapp =烧瓶(__name __)#索引 
@ app.route('/',Methods = ['GET'])
def app_index():
如果__name__ ==“ __main__”,则返回“ Hello World”:
app.run(主机='0.0.0.0',端口= 80)

./app/requirements.txt

 烧瓶 

步骤2→甜蜜的Dockerfile

./Dockerfile

请注意, terrillo / python3flask映像安装了Python3.7和许多依赖项。

 从terrillo / python3flask:latest 

#文件的静态路径。
#不要使用烧瓶静态。 Nginx是你的朋友
ENV STATIC_URL /静态
ENV STATIC_PATH / app / static

#将Flask应用程序放置在服务器上
复制./app / app
WORKDIR / app

#安装requirements.txt
运行pip3 install --no-cache-dir -r requirements.txt

#NGINX设置
复制./nginx.sh /nginx.sh
运行chmod + x /nginx.sh

ENV PYTHONPATH = /应用程序

ENTRYPOINT [“ /nginx.sh”]
CMD [“ /start.sh”]

展览80443

步骤3→nginx.sh

./nginx.sh

此步骤使用Dockerfile中的环境变量为Nginx服务器配置静态路径

  #!  / usr / bin / env bash#最大文件更新 
设置-e
回声“ client_max_body_size 0;” > /etc/nginx/conf.d/upload.conf#静态文件设置
USE_STATIC_URL = $ {STATIC_URL:-'/ static'}
USE_STATIC_PATH = $ {STATIC_PATH:-'/ app / static'}#生成Nginx配置
回声“服务器{
听80;
位置 / {
try_files \ $ uri @app;
}
位置@app {
包括uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
位置$ USE_STATIC_URL {
别名$ USE_STATIC_PATH;
}“> /etc/nginx/conf.d/nginx.confif [[$ STATIC_INDEX == 1]];然后
echo“ location = / {
索引$ USE_STATIC_URL / index.html;
}“ >> /etc/nginx/conf.d/nginx.conf
fi#完成Nginx配置文件
回声“}” >> /etc/nginx/conf.d/nginx.confexec“ $ @”

步骤4(可选)→docker-compose.yml

./docker-compose.yml

使用Docker Compose,您可以在应用程序轻松运行时对其进行编辑,并在进行更改时自动重新加载它。 在此示例中,默认端口设置为3000。Docker Compose具有其他出色的功能,例如一起运行docker映像。 考虑一下Flask + MySQL。 在此处了解更多信息https://devcenter.heroku.com/articles/local-development-with-docker-compose

 版本:“ 2” 
服务:
网络:
container_name:dockerflask
重启:总是
建立:
内容:。
dockerfile:./ Dockerfile
命令:[]
端口:
-“ 3000:80”
数量:
-./app:/app

与Docker Compose一起运行

  docker-compose构建 
码头工人组成

要么

没有Docker Compose的情况下运行

  docker build -t dockerflask。 
docker run -p 3000:80 dockerflask

Docker将继续下载所有依赖项并设置容器。

打开http:// localhost:3000 /

添加新的点子软件包时,请确保更新您的requirements.txt。 此更改还需要重建Docker映像。

希望您将Flask在生产中的使用和娱乐性更好地体验。 我已经将此设置用于各种项目。 最受欢迎的示例是https://ulna.co/。 Docker Compose用于我的本地然后用于生产的AWS Beanstalk。

GitHub示例:https://github.com/terrillo/py-docker