本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu。

Flask系列文章

  1. Flask开发初探
  2. WSGI到底是什么
  3. Flask源码分析一:服务启动
  4. Flask路由内部实现原理

部署方案

在开发时,我们使用flask run命令启动的开发服务器是werkzeug提供的,但是这种方式目的是为了开发,不能很好的扩展,不适合生产部署。生产部署,我们需要一个更强健,性能更高的WSGI服务器(关于WSGI,可参考WSGI到底是什么 ,常用的服务器有:uWSGI、Gunicorn等,本文以uWSGI举例。

像uWSGI这类WSGI服务器内置了Web服务器,所以我们不需要web服务器也可以与客户端交换数据,处理请求和响应,但是内置的web服务器不够强健,一般情况下都会使用一个常规的web服务器运行在前端,为WSGI服务器提供反向代理,web服务器选择Nginx,Nginx会把外部的请求转发给uWSGI处理,接收到响应后再返回给客户端,这样做的好处有:

  1. 提高静态文件的效率,因为Nginx处理静态文件的速度非常快
  2. 提升系统安全性,避免直接暴露WSGI服务器
  3. 提升程序处理能力,通过设置反向代理,配置负载均衡可以实现。

uWSGI配置

在使用uwsgi部署flask应用时,一定要记得将app.run()方法放在if __name__ == '__main__': 内部或者单独文件内,这样就可以保证其不会被调用,从而不会启动本地服务器。

uwsgi是一个服务器,使用前一定要安装:

pip install uwsgi

配置文件:

socket=/tmp/app.sock
chmod-socket=666
pidfile=/etc/nginx/uwsgi.pid
chdir=/home/**/mygithub/learn_flask/app
master=true
wsgi-file=serve.py
http=127.0.0.1:8005
callable=app
processes=8
threads=4
lazy-apps=true

对所配置的参数进行说明:

  • callable:Flask项目的实例名称
  • module:可调用对象的名称
  • processes:开启多少个子进程处理请求。
  • threads:每个进程的线程数

更多参数详情可见:uwsgi中文文档

在命令行中启动uwsgi服务器:

uwsgi --ini uwsgi.ini

在浏览器中输入 http://127.0.0.1:8005,可以验证服务启动。

nginx配置

安装nginx:

apt-get install nginx

启动nginx:

service nginx start

重启

service nginx restart

nginx配置:

server{
listen 8080;
server_name localhost; access_log /var/log/nginx/app_access.log;
error_log /var/log/nginx/app_error.log; location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock
}
}

nginx配置文件nginx.conf通过include引用了conf.d和site_enabled这两个文件夹中的配置文件,所以我们可将配置文件放在这两个路径任意一处。

重启nginx和uwsgi,在浏览器中输入 http://127.0.0.1:8088 ,可以验证服务启动。

这样,就完成基础的nginx+uwsgi完成了Flask的部署。

容器化部署

接下来,介绍使用docker进行容器化部署。

docker配置

建议了解docker基本操作,首先,创建Dockerfile:

FROM ubuntu:16.04

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN apt update && apt install -y iputils-ping python3 python3-pip python3-tk libffi-dev libssl-dev
RUN apt install -y nginx && pip3 install uwsgi ADD ['./', "/app"]
ADD ['./build', "/app"]
WORKDIR /app RUN pip3 install -r requirements.txt RUN chmod + x start_script.sh
CMD ['/start_script.sh']

注意:

  1. 该镜像的基础镜像为ubuntu:16.04,可自行docker pull
  2. 编写服务启动脚本start_script.sh
ln -s /app/nginx.conf /etc/nginx/conf.d/
nginx && uwsgi --ini uwsgi.ini python3 serve.py

使用命令:

docker build -t image .

以上,就完成了一个镜像打包,接下来就是docker容器的常规化操作。另外,推荐使用k8s对docker容器进行编排管理,这里不做介绍。

代码可参照:my github

Flask容器化部署原理与实现的更多相关文章

  1. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  2. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  3. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署

    1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...

  4. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  5. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...

  6. Ubuntu系统下容器化部署gitlab

    容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...

  7. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  8. Jaeger容器化部署

    概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...

  9. Gogs的Docker容器化部署流程遇到的问题

    Gogs的Docker容器化部署流程遇到的问题   最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...

随机推荐

  1. jquery微信浏览器阻止页面拖动

    jquery微信浏览器阻止页面拖动<pre>function bodyScroll(event) { event.preventDefault();} document.body.addE ...

  2. 访问控制列表ACL

    1.ACL Access list ,访问控制列表. 2.作用 限制网络中的地址访问. 3.主要内容 Eg: Router(config)#access-list ? <一>. <1 ...

  3. java-optional-快速使用-教程

    前言: 在公司中开发项目时碰到一个从Java8引入的一个Optional类,以前jdk版本使用的比较低,没有使用过,于是我在网上浏览了一些文档写篇文章学习总结一下,希望没有用过的朋友们都能够快速学习到 ...

  4. js数组方法大全(上)

    # js数组方法大全(上) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 join() reverse() sort() concat() slice( ...

  5. AI的真实感

    目录 1.让AI"不完美"--估算和假设 2 AI感知 全能感知 特定感觉无知 3 AI的个性 4 AI的预判 5 AI的智能等级 ​ AI的真实感一直是游戏AI程序员追求的目标, ...

  6. LocalDate类

    LocalDate类与Date类不同.Date类是距离一个固定时间点的毫秒数(UTC 1970.1.1 00:00:00) Date类表示时间点,LocalDate类用来表示日历表示法. import ...

  7. Python OpenCV4趣味应用系列(四)---颜色物体实时检测

    今天,我们来实现一个视频实时检测颜色物体的小实例,视频中主要有三个颜色物体,我们只检测红色和绿色的球状物体,如下图所示: 第一步需要打开视频(或者摄像头): cap = cv2.VideoCaptur ...

  8. 比较一下inner join(可直接简写为join)和where直接关联

    SELECT * FROM A ,B WHERE A.ID = B.ID 是比较常用的2个表关联.之前一直用这个,后来换了家公司发现这家公司的报表大多数都是用inner join,稍微研究了一下.查阅 ...

  9. Docker+Dubbo+Zookeeper实现RPC远程调用

    Docker+Dubbo+Zookeeper 1.安装Docker 1.1卸载旧版本的Docker //如果Docker处于与运行状态 未运行可跳过 [root@MrADiao ~]# systemc ...

  10. 搭建Redis三主三从集群

    Redis三主三从集群规划 10.0.128.19   使用端口 7000  7001 10.0.128.22   使用端口 7002  7003 10.0.128.23   使用端口 7004  7 ...