• 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

  • 相关阅读:
    如何使用git提交代码
    Eclipse升级ADT
    android学习:android开发常见技巧设置,提高开发效率
    Apache -Common-lang包使用
    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    Asp.Net MVC entity framework模型验证
    Activity启动模式
    http服务器交互get,put,post,delete等说明
    js模块化插件开发
    Android Asynchronous Http Client异步网络请求使用
  • 原文地址:https://www.cnblogs.com/ybjourney/p/12014120.html
Copyright © 2020-2023  润新知