Flask 项目部署(Docker + Flask + uwsgi + Nginx)

2023-11-18


Author:Gorit
Date:2021/5/14
2021年发表博文: 18/50

参考资料:

  1. Flask后端:Docker+Gunicorn+Nginx部署
  2. 一个 Unix 上可以用的 uwsgi Server 服务器
  3. gunicorn 配置详解
  4. Flask + gunicorn + nginx 部署参考

一、项目背景

近期参加比赛,原本 windows server 部署的 Flask 后端项目所用的服务器快要过期了,开始改用 Linux 服务器部署。

写过 Flask 项目的同学都知道, Flask 内置的 WSGI 服务器,只适合开发调试使用,但是如果要部署在生产环境,性能是完全不够用的。

Flask app 和 用户交互流程如下:

Flask app(web 应用) <—> uWSGI (实现了 uwsgi 协议的 web 服务器,可以实现 uwsgi 协议 与 http 协议的相互转化)<-> Nginx(高性能的 http 服务器)

所以,经过查阅网上已有的方案 + 自己的实践,找到了一套可用性比较高的部署方案,于是将本次的实践记录下来,以备日后所需。最终我哦采用的部署方案为

flask + gunicorn + Nginx

二、项目部署

基础的知识就不补充了,但是我会在关键命令写注释

2.1 项目基础环境

以下环境及基础操作,默认大家是会的,毕竟已经安装完成

  1. Linux 云服务器(CentOS7 环境) 阿里云,腾讯云均可
  2. Nginx (高性能的 HTTP服务器)
  3. Docker + Docker Compose(容器编排)
  4. Flask app(Python 环境由 Docker 提供)
  5. SSL 证书配置(需要用到反向代理 HTTPS)

2.2 获得 Python 环境的所需依赖

在你的 Flask 项目根目录中,输入如下命令

pip freeze > requirement.txt

过一会,就能在当前目录看到一个名为 requirement.txt 的文档

当然,我们还需要另外两个依赖,现在可以先不管,在 Docker 里面安装即可。

  1. gunicorn
  2. gevent

在这里,我们以一个 Python 单页面应用为示例,命名为 app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

OK, 到这步,Python 基础环境搭建完毕

2.3 配置 gunicorn

创建 gun.conf 文件

# 并行工作进程数
workers = 2
# 指定每个工作者的线程数
threads = 4
# 监听内网端口80
bind = '0.0.0.0:80'
# 工作模式协程
worker_class = 'gevent'
# 设置最大并发量
worker_connections = 2000
# 设置进程文件目录
pidfile = 'gunicorn.pid'
# 设置访问日志和错误信息日志路径
accesslog = 'gunicorn_acess.log'
errorlog  = 'gunicorn_error.log'
# 设置日志记录水平
loglevel = 'info'
# 代码发生变化是否自动重启
reload=True

2.4 编写 Dockerfile

编写 Dockerfile 内容如下:

# 镜像环境,我们要 python 3.8.0
FROM python:3.8.0  
# 这句话可有可无,标识你是编写这个 Dockerfile 的作者信息
MAINTAINER "code<aaax@xx.com>" 
# 配置工作目录
WORKDIR /code  

# 拷贝当前目录所有的文件,进入 docker 镜像中
COPY . .

# 执行安装 Python 环境依赖
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gunicorn gevent
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

# 暴露 80 端口,给外部使用,因为上面我们开启的是 80 端口
EXPOSE 80

# 使用 gunicorn 运行 Flask 项目,最后一个命令: app:app  前者对应的是flask 启动 文件,后面不要乱改
CMD gunicorn  -c gun.conf app:app

2.5 编写 docker-compose (选用)

docker-compose 只不过是让项目部署的更加优雅一点,实际和 Docker 创建容器,运行是一样的

version: "3"
services:
  flask_test:
    image: flask-test:2.0 # 生成的镜像的名称 和 tag
    build: . # 一键构建镜像  =================  以上为构建命令,以下为运行命令
    restart: always # 总是重启
    container_name: flask_v2 # 运行后的容器的名称
    ports:
      - "5500:80" # 端口映射, 这里是将 docker 容器内的 80 端口映射到云服务器的 5500 端口

运行项目

docker-compose up -d # 运行项目,并且后台执行
docker-compose ps # 查看当前目录下 docker-composse 的运行状态

2.6 Docker 构建镜像,并且运行

上面的 docker-compose 对应的 docker 构建镜像命令如下

docker build -t flask-test:2.0 .  # 构建镜像
# 查看构建好的镜像
docker images

在这里插入图片描述

# 运行容器
docker run -d -p 5500:80 --name flask_v2 --restart=always 需要运行的IMAGE ID

在这里插入图片描述

2.7 nginx 反向代理

    upstream test {
        server 127.0.0.1:5500;
    }
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  服务器域名;
        root         443 端口默认静态文件;

        ssl_certificate "你的整数 pem";
        ssl_certificate_key "你的整数key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
	
		location /flask {
                proxy_pass http://test/;
        }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

大功告成

三、总结

  1. Docker + Nginx + gunicorn 部署项目
  2. docker 与 docker-compose 运用
  3. Nginx 反向代理配置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask 项目部署(Docker + Flask + uwsgi + Nginx) 的相关文章

  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 无法将 docker 映像推送到本地 OpenShift Origin 注册表

    目标是能够在我的笔记本电脑上获取 Docker 映像并将其推送到 OpenShift Origin 映像注册表 由oc cluster up 进行本地开发 目前尚不清楚我是否做错了什么 或者 Docker 或 OpenShift Origi
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 当 ssl 和 http2 打开时,Nginx 似乎忽略 server_name

    我有这个 nginx 配置 server listen 80 default server listen 80 default server server name www example com return 301 https www
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • Docker Hub API v2 令牌身份验证问题

    目前 我正在开发一个非常轻量级版本的 Docker 容器编排器 并且我必须能够从公共 Docker Hub 注册表获取图像摘要 我想使用 Docker Registry API v2 来实现此目的 我正在尝试使用以下 API 调用获取授权令
  • nginx设置问题

    我知道这不是一个直接的编程问题 但是 stackoverflow 上的人似乎能够回答任何问题 我有一台运行 Centos 5 2 64 位的服务器 非常强大的双核 2 服务器 具有 4GB 内存 它主要提供静态文件 Flash 和图片 当我
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • docker repo 解决映像构建期间的错误错误(检查存储库文件)

    我在构建 docker 映像时遇到问题 并尝试了不同的 DNS 选项 但似乎运气不佳 Docker版本1 9 1 构建a34a1d5 回购还活着 为了运行我使用的容器docker run dns 192 168 1 1 d ti name
  • 在没有 noexec 选项的情况下将卷挂载到 docker 容器中

    据我所知 docker 也包括 docker compose 使用 noexec 选项将卷安装到容器中 因此我无法从安装的目录中启动任何程序 services app build context dockerfile Dockerfile
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 我可以更改 Windows Docker 容器中的日期和时间吗?

    我正在尝试测试一个在特定时间段内导出文件的软件 我想到使用 docker 容器来提供所需的时间而不是使用系统时间 问题是我缺乏更改容器时间的权限 并出现以下错误消息 PS C usr src app gt Set Date Date Get
  • 经常提交 docker 容器是一个好习惯吗?

    我在里面使用WebSphere Liberty 由于 WebSphere Liberty 需要频繁的 xml 编辑 这对于 Dockerfile 命令来说是不可能的 我必须不时地对容器进行 docker commit 以便其他人可以使用我的
  • Nginx 配置文件在 Elastic Beanstalk 部署期间被覆盖?

    我需要将 p3p 标头添加到标准 Nodejs 和 Nginx Elastic Beanstalk 上的静态资源位置 我创建了一个ebextension脚本如上所解释这个问题 https stackoverflow com question
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Nginx 与 Daphne 给出 502 Bad Gateway

    由于 Django Channels 和 uwsgi 出现问题 我决定用 daphne 替换 uwsgi 关注后this http masnun rocks 2016 11 02 deploying django channels usin

随机推荐

  • 小白也能学会的爬虫教学(超详细,每一步都配图,不怕你学不会,图文并茂,看完直呼‘爽’)

    详细且简单的爬虫简单教学 小白看了之后直呼 爬虫就这 安装pycharm 一 新建一个工程 二 安装scrapy 三 创建Scrapy工程 四 如何使用scrapy 1 新建一个begin py文件 2 编辑begin py中的内容 3 修
  • hbase MapReduce程序样例入门

    hbase MapReduce程序样例入门 1 先看一个标准的hbase作为数据读取源和输出源的样例 Configuration conf HBaseConfiguration create Job job new Job conf job
  • 定时器:Quartz框架

    文章目录 简介 简单Demo cron 规则 参考 简介 Quartz是 OpenSymphony 开源组织在 Job scheduling 领域的开源项目 是由 java 开发的一个开源的任务日程管理系统 Quartz 是一个功能丰富的开
  • 如何下载安装VS2017下载 vs2017社区版

    如何下载安装VS2017下载 vs2017社区版 https blog csdn net zyhse article details 105362609 1 下载vs2017的引导程序 官方并没有为vs2017提供离线安装包 所以我们选择在
  • 操作系统课程设计

    关于完整代码 更详细内容 实验一环境配置 请访问github仓库地址 GitHub zzering OS course design 操作系统课设 系统调用 磁盘调度算法 文件调用 进程管理 分页置换算法 进程通信 实验一 为Linux系统
  • python二元操作符是什么_python笔记—06 讲:Pyhon 之常用操作符

    本期内容详解 1 算术运算符 加 减 乘 除 幂运算 地板除 1 和 的区别 在 Python 中的除运算符与其它程序语言的不太一样 表示真正的除号 例如 1 3 0 3333333333333333 而 4 2 的值为 2 0 说明两个数
  • Flask处理前台POST过来的JSON

    POST JSON数据的JS代码 ajax url http 127 0 0 1 5000 calc type post dataType json headers Content Type application json charset
  • 数据结构——线性表(C++)

    线性表 一 线性表的定义 二 线性表的抽象数据类型 三 线性表的顺序存储 1 顺序存储定义 2 顺序存储的实现方式 四 线性表的链式存储 五 其他线性表 参考 一 线性表的定义 线性表 零个或多个数据元素的有限序列 线性表是最常用且是最简单
  • 开启防火墙脚本

    sc config MpsSvc start AUTO net start MpsSvc
  • VMware ESX与VMware ESXi区别

    VMware ESX 与 VMware ESXi 区别 现在来讲vSphere就是ESXI 只是两种叫法而已 我们来看看VMware服务器虚拟化产品的历程 Vmware 服务器虚拟化第一个产品叫ESX 该产品只有60天测试 没有官方认可的免
  • DAY18:Xss 靶场通关手册

    DAY18 Xss 靶场通关手册 常见的xss注入 lt img src x onerror alert 1 gt
  • nvidia深度学习加速库apex简单介绍

    介绍地址 https docs nvidia com deeplearning sdk mixed precision training index html 本人英文水平有限 有误请指正 使用理由 使用精度低于32位浮点的数值格式有许多好
  • 设计模式(二十二) 策略模式

    有时候对象需要按照某种策略改变行为 我们可以利用策略模式 将策略或算法提取出来 作为单独的类实现 使用策略模式 可以让具体算法和应用对象分离 方便的根据不同条件替换策略 下面举一个例子 我们有一个计算器 它会按照快和慢两种策略来计算结果 所
  • 解决Linux普通用户使用Wireshark的权限不足的问题

    dumpcap需要root权限才能使用 如果是普通用户 Wireshark就没有权限使用dumpcap进行截取封包 解决方法 将dumpcap更改为Wireshark用户组 sudo chgrp wireshark usr bin dump
  • vue3_父子组件传参

    最近在看b站 小满zs 的vue3教程 巩固一下 1 父 gt 子组件 父组件自定义一个属性 用v bind 绑定在子组件上
  • couldn't find native method

    有两个原因 1 java这边native方法没有 native void renderFrameStart 2 c这边没有实现native方法 12 29 15 52 27 901 32735 32735 com ffmpegtest E
  • vue模板语法(上)

    目录 一 插值 什么是插值 建立一个html来编写插值 输出结果 二 指令 什么是指令 建立一个html来编写指令 输出结果 编辑 动态参数 输出结果 三 过滤器 什么是过滤器 建立一个html来编写过滤器 输出结果 4 计算属性 监听属性
  • STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

    STM32F103C8T6驱动舵机SG90 配置定时器TIM2 TIM3 TIM4的多种重映射模式下的不同IO口 1 使用到的工具介绍 2 整个简单介绍 3 程序的介绍 1 使用到的工具介绍 keil5 烧写软件FlyMcu exe 硬件为
  • CS143-project2 局部特征匹配 Local Feature Matching

    本项目通过harris算法对图像进行兴趣点的检测和提取 然后计算兴趣点周围4 4区域的8个方向特征向量 最后对获取到的特征向量对进行匹配 本算法对旋转 缩放 亮度变化保持一定程度的稳定性 环境 操作系统 WIN7 实现平台 MATLAB20
  • Flask 项目部署(Docker + Flask + uwsgi + Nginx)

    文章目录 一 项目背景 二 项目部署 2 1 项目基础环境 2 2 获得 Python 环境的所需依赖 2 3 配置 gunicorn 2 4 编写 Dockerfile 2 5 编写 docker compose 选用 2 6 Docke