Flask容器化部署原理与实现

本文将介绍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

原文地址:https://www.cnblogs.com/ybjourney/p/12014120.html

时间: 2024-08-29 21:56:25

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

Kubernetes 集群的两种部署过程(daemon部署和容器化部署)以及glusterfs的应用!

ClusterIp:通过VIP来访问, NodePort: 需要自己搭建负载据衡器 LoadBalancer:仅仅用于特定的云提供商 和 Google Container Engine https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/ port:相当于服务端口(对及集群内客户访问) targetPort: 相当于pods端口 nodePort: 宿主机端口(也是服务端口,只不过是对集群外客户访问)

Spring Boot Tomcat 容器化部署实践与总结

在平时的工作和学习中经常会构建简单的web应用程序.如果只是HelloWorld级别的程序,使用传统的Spring+SpringMVC框架搭建得话会将大部分的时间花费在搭建框架本身上面,比如引入SpringMVC,配置DispatcheherServlet等.并且这些配置文件都差不多,重复这些劳动似乎意义不大.所以使用Springboot框架来搭建简单的应用程序显得十分的便捷和高效. 前两天在工作中需要一个用于测试文件下载的简单web程序,条件是使用Tomcat Docker Image作为载体

Kolla 容器化部署Openstack

1.集群架构  其中e1,e2,e3 表示网卡. e1 所在网络为管理网. e2 为vm对外通信网卡,无需配置网络协议和ip地址: BOOTPROTO=none DEVICE=eth1 HWADDR=fa:16:3e:38:20:88 ONBOOT=yes TYPE=Ethernet USERCTL=no .... e3所在网络为osd集群通信网络 备注:操作系统为centos7.4 最小化安装 2. kolla容器化部署openstack及ceph集群 2.1 基础环境 以下操作在部署机执行

【巨杉数据库SequoiaDB】巨杉 Tech | 几分钟实现巨杉数据库容器化部署

随着业务负载的不断加重,容器化.虚拟化也成为各类在线应用必须要具备的能力.对于分布式数据库,容器化也是提升快速部署.提高运维效率的一个很好的路径. 我们重新优化了 Docker部署的方式,帮助大家更快的上手SequoiaDB集群,本文就将介绍基于 Docker 的SequoiaDB分布式集群快速部署. 1.集群配置 我们将在六个容器中部署一个多节点,高度可用的 SequoiaDB 集群,如下所示: (本文以 SequoiaDB v3.2.3 版本为例) ? 该集群包括一个协调器节点.一个目录节点

jenkins的容器化部署以及k8s应用的CI/CD实现

1. 使用Helm安装Mysql: ??上一篇博文谈到了如何使用Helm安装Redis和RabbitMQ,下来我们来聊聊如何用Helm安装mysql. ??本人对于Mysql数据库不是非常熟悉,因为我们公司的分工比较明确,数据库这块的工作主要由DBA负责,运维同学只负责应用的维护. ??按照我们前面博文的描述,首先是在官方文档查看helm安装mysql的书名: https://github.com/helm/charts/tree/master/stable/mysql ??我根据官方文档的描述

超级简便的容器化部署工具(使用 ASP.NET Core 演示)

Docker 改变了我们部署网站的方式,从原先的手动编译打包上传,到现在的构建镜像然后推送部署,让我们在配置环境上所花费的时间大大减少了.不仅如此,通过一系列相关的工具配合,可以很轻松的实现 CI.CD.本文即将介绍的就是这么一款非常简便的工具--captainduckduck,使用 captainduckduck 只需要很少的 Docker 知识. 简介 原先,我们的部署流程可能是这样的: 拉取代码 -> 构建镜像 -> 启动容器 除此之外,还需要配置 HTTPS,配置反向代理,如果要更新应

容器化部署Cassandra高可用集群

前提: 三台装有docker的虚拟机,这里用VM1,VM2,VM3表达(当然生产环境要用三个独立物理机,否则无高可用可言),装docker可参见Ubuntu离线安装docker. 开始部署: 部署图 如上图所示,三台VM的IP分别为: 192.168.0.101 192.168.0.102 192.168.0.103 客户端将使用这三个IP来连接集群,每个VM通过端口映射由docker网桥myBridge来与Cassandra容器通信,容器的IP会在启动容器时指定 部署步骤: 1. 建docke

kubespray容器化部署kubernetes高可用集群

一.基础环境 docker版本1.12.6 CentOS 7 1.准备好要部署的机器 IP ROLE 172.30.33.89 k8s-registry-lb 172.30.33.90 k8s-master01-etcd01 172.30.33.91 k8s-master02-etcd02 172.30.33.92 k8s-master03-etcd03 172.30.33.93 k8s-node01-ingress01 172.30.33.94 k8s-node02-ingress02 172

容器化部署——docker常用命令

1.使用docker ps命令查看有哪些进程 2.进入容器: 原文地址:http://blog.51cto.com/7539178/2174963