[Python] flask运行+wsgi切换生产环境+supervisor配置指南

文章目录

  • 问题背景
  • flask启动
    • 方式1(编写main函数):
    • 方式2(编译器):
    • 方式3(命令行):
    • 方法4(重命名文件法):
    • 方法5(使用flask命令行):
  • 关于WSGI
  • 生产环境
    • 专业wsgi服务器
    • 托管平台
  • 自动化管理
    • yum安装supervisor
  • END

问题背景

flask项目本地启动时,控制台会打印如下warning

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

在这里插入图片描述
翻译成 人话就是,“我这个环境就是你开发时用,实际生产的时候可别找我,出事我不负责。”

好家伙呀。


但是他指了另外一条路:Use a production WSGI server

依然还是带着问题学习,从本篇文章可以了解如下内容

  1. flask本身自带的为啥不能用?
  2. 他推荐的是什么?为什么他能用?
  3. 怎么部署一个wsgi?以及后续怎么用?

额外知识补充:flask的多种启动方式

Before we start, 本教程假设你已经有一个flask应用并准备部署了。

flask启动

方式1(编写main函数):

直接在文件里写个main函数然后运行

if __name__ == '__main__':
    # 本地启动
    # 这里的HOST_IP及SERVER_PORT可以自己设置
    app.run(host=HOST_IP, port=SERVER_PORT, debug=True)

方式2(编译器):

我用的是pyCharm,可以直接进行配置
在这里插入图片描述
按照如下方式进行配置,首先点击左上角加号,分类为Flask server,Additional options为运行的额外参数,需要在变量位置增加FLASK_APP=你的py文件地址。这里的py文件就是你包含了app = Flask(__name__) 这行代码的文件。

在这里插入图片描述
启动起来啦
在这里插入图片描述

方式3(命令行):

依然先设置环境变量,在终端中输入(非常关键的是等号旁边不要有空格!)

set FLASK_APP=D:\Code\ctb_v2\app\controllers\hello.py

检查一下设置成功没有
在这里插入图片描述
输入flask runpython -m flask run运行应用

在这里插入图片描述

如果需要指定ip或者端口

flask run --host=0.0.0.0 --port=9999

方法4(重命名文件法):

可以把文件命名为app.py或者wsgi.py,再进入到该文件的文件夹,运行flask run启动项目。

在这里插入图片描述

方法5(使用flask命令行):

通过flask --app的命令行进行设置
在这里插入图片描述

关于WSGI

wsgi是啥?全称是Python Web Server Gateway Interface。由此可以看出它是接口,并非一个统称的服务器类型。它提供了web服务器和web应用之间的通用接口,服务器和框架的开发者需要按照WSGI的规则去实现。

需要注意的是
Flask应用本身就是一个WSGI应用!
直接看flask的代码

# 位于flask\app.py文件
  def __call__(self, environ: dict, start_response: t.Callable) -> t.Any:
        """The WSGI server calls the Flask application object as the
        WSGI application. This calls :meth:`wsgi_app`, which can be
        wrapped to apply middleware.
        """
        return self.wsgi_app(environ, start_response)

可以看到它直接Flask app创建时实际是引用了wsgi_app.

因此回看那条报错,实际上它是说,启动flask的开发wsgi(内置)服务器不稳定,生产环境要用生产的wsgi服务器


生产环境

在生产环境中,可以使用生产wsgi服务器或托管平台来运行flask应用。以下分别进行简单介绍。

专业wsgi服务器

1. Gunicorn

全称令人意想不到:Green Unicorn哈哈哈。

  • 不支持Windows
  • 不需要额外的依赖或编译、易安装
  • 使用方式:gunicorn myproject:app,这就等于python文件中写的 from myproject import app
  • 可设定进程数:gunicorn -w 4 myproject:app 表示要运行4个进程
  • 可开放外部访问:gunicorn -b 0.0.0.0 -w 4 myproject:app
  • 可gevent 或 eventlet 进行异步操作

2. Waitress

  • 支持windows
  • 不需要额外的依赖或编译、易安装
  • 不支持流式请求
  • 创建一个进程,由进程创建多个线程
  • 使用方式:waitress-serve --host 0.0.0.0 hello:app 等于 ‘from hello import app’
  • 若为工厂方法:waitress-serve --host 127.0.0.1 --call hello:create_app 等于 ‘from hello import create_app’

3. mod_wsgi

  • 支持windows
  • 与Apache httpd集成
  • 需要编译器和apache开发头文件来安装,可以参考这个文章apache+mod_wsgi+flask部署

4. uWSGI

  • 不支持Windows
  • 配置复杂
  • 是已编译的服务器套件
  • 支持gevent异步操作

托管平台

常见的托管平台包括以下,这里不展开了。

  • PythonAnywhere
  • Google App Engine
  • Google Cloud Run
  • AWS Elastic Beanstalk
  • Microsoft Azure

自动化管理

为了方便进程管理,这里使用supervisor来管理我们的服务,例如后台运行,重启,日志输出等等都可以通过supervisor进行控制。

可以使用两种方式进行安装,推荐yum(如果系统是centOS) ,通过pip或者agt(Ubuntu)进行安装步骤会多一些。
以下介绍yum的安装方式

开始之前,先区分几个名词

supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program和supervisor服务本身。

yum安装supervisor

1. 安装

#切换为root用户
sudo su 
yum install epel-release
yum install -y supervisor
# 开机自启动
systemctl enable supervisord 
# 启动supervisord服务
systemctl start supervisord 
# 查看supervisord服务状态
systemctl status supervisord 
# 查看是否存在supervisord进程
ps -ef|grep supervisord 

2. 配置
访问supervisord的配置文件

vim /etc/supervisord.conf 

在这里插入图片描述
这个文件夹保存的是supervisor管理的服务的配置文件
我们去这个文件夹下面创建文件

vim /etc/supervisord.d/myprogram.init

这里面具体怎么写,可以参考刚刚/etc/supervisord.conf 文件里有提供参考,以下提供一个示例

[program:你的服务名]   
; 启动命令 以下为gunicorn的实例,按实际情况来,比如:flask run
; 具体命令参考上面flask启动那一章
command=gunicorn pygun.conf wsgi:app --log-level=debug --preload
; 工作目录(脚本启动目录的全路径)
directory=/a/b/c
; 进程数
numprocs=1
; supervisord尝试启动一个程序时尝试的次数。默认是3
startretires=5
; supervisord守护程序启动时自动启动
autostart=true    
; supervisord守护程序重启时自动重启     
autorestart=true
;将stderr重定向到stdout        
redirect_stderr=true   
; 日志标准输出路径,同时脚本print打印信息也会在改文件显示
stdout_logfile=./stdout.log
stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
stderr_logfile=./error.log
stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)

3. 加载配置

#读取有更新的配置文件,不会启动新添加的程序
supervisorctl reread
#重启配置文件修改过的程序
supervisorctl update
#启动xx程序
supervisorctl start 你的服务名
#查看所有服务状态
supervisorctl status

END


参考

  1. flask的官方使用教程:https://flask.palletsprojects.com/en/2.2.x/quickstart/
  2. flask的官方部署教程:https://flask.palletsprojects.com/en/2.2.x/deploying/
  3. WSGI官方文档:https://peps.python.org/pep-0333/
  4. 其他博主的文章:centos7安装supervisor详细教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/50257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++ 进阶】第 1 章:[C 语言基础] C 语言概述与数据类型

目录 一、C 语言的概述 (1)计算机结构组成 (2)计算机系统组成 (3)ASCII 码 (4)计算机中的数制及其转换 (5)程序与指令 (6)语…

菜鸡shader:L13 渐隐渐显的UV动画

文章目录 SD部分Shader代码部分 呃呃,这是目前我学习庄懂AP01课程的最后一节了,我看了一下21集之后的内容是关于LightingMap,目前感觉还用不到,加上之前参与过一个项目里面也有用到LightingMap,也算了解过,…

【深度学习】【Image Inpainting】Generative Image Inpainting with Contextual Attention

Generative Image Inpainting with Contextual Attention DeepFillv1 (CVPR’2018) 论文:https://arxiv.org/abs/1801.07892 论文代码:https://github.com/JiahuiYu/generative_inpainting 论文摘录 文章目录 效果一览摘要介绍论文贡献相关工作Image…

Unity XML1——XML基本语法

一、XML 概述 ​ 全称:可拓展标记语言(EXtensible Markup Language) ​ XML 是国际通用的,它是被设计来用于传输和存储数据的一种文本特殊格式,文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标…

23款奔驰GLS450加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶,可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出,并且在关闭后能够立刻散去。车内气味不会永久改变,香氛…

maven编译报错

参考链接:mvn打包No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK_51CTO博客_mvn打包命令 在执行 yum install -y java-1.8.0-opensdk命令后,使用maven去编译打包,结果报错, …

STM32MP157驱动开发——按键驱动(工作队列)

文章目录 “工作队列”机制:内核函数work_struct 结构体定义 work使用 work :schedule_workworkqueue 其他函数 工作队列方式的按键驱动程序(stm32mp157)编程思路button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “工作队列”机制&#xff1…

找不到vcruntime140.dll无法继续执行代码怎么办?(详解)

1.vcruntime140.dll是什么?有什么作用? vcruntime140.dll是Windows操作系统中的一个动态链接库文件,它属于Microsoft Visual C Redistributable的一部分。DLL是Dynamic Link Library的缩写,它包含了一系列函数和资源,…

Linux 系列 常见 快捷键总结

强制停止 Ctrl C 退出程序、退出登录 Ctrl D 等价 exit 查看历史命令 history !命令前缀,自动匹配上一个命令 (历史命令中:从最新——》最老 搜索) ctrl r 输入内去历史命令中检索 # 回车键可以直接执行 ctrl a 跳到命令开头 …

【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

文章目录 前言声明和初始化扩容时机源码分析go1.17go1.18内存对齐 总结 前言 在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装…

springboot+mybatis-plus+vue+element+vant2实现短视频网站,模拟西瓜视频移动端

目录 一、前言 二、管理后台 1.登录 2.登录成功,进入欢迎页 ​编辑 3.视频分类管理 4. 视频标签管理 5.视频管理 6.评论管理 ​编辑 7.用户管理 8.字典管理 (类似于后端的枚举) 9.参数管理(富文本录入) 10.管…

第12章 Linux 实操篇-Linux磁盘分区、挂载

12.1 Linux 分区 12.1.1 原理介绍 (1) Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构, Linux中每个分区都是用来组成整个文件系统的一部分。 (2) Linux采用了一种叫“载入”的处理方法,…

LeetCode 75 第十三题(1679)K和数对的最大数目

题目: 示例: 分析: 给一个数组,两个和为K的数为一组,问能凑成几组。 既然一组是两个数,那么我们可以使用双指针分别指向数组首尾,然后再判断能否凑成和为K的组. 在使用双指针寻找之前,我们应当先将数组排序(升序降序都无所谓),…

Python Web开发技巧VII

目录 装饰器inject_serializer 装饰器atomic rebase git 清理add的数据 查看git的当前工作目录 makemigrations文件名称 action(detailTrue, methods["GET"]) 如何只取序列化器的一个字段进行返回 Response和JsonResponse有什么区别 序列化器填表和单字段如…

红黑树与平衡二叉树

文章目录 前言一、平衡二叉树二、红黑树区别 前言 数据库的底层用到了多种树结构,这里简单记录一下红黑树与平衡二叉树。 一、平衡二叉树 满足二叉树。任何节点的两个子树的高度最大差为1。如果对平衡二叉树进行删除和新增,那么会破坏平衡,…

JavaSE - Sting类

目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等(返回值是boolean类型) 2. 比较两个字符串的大小(返回值是int类型) 3. 字符串查找 (1)s1.charAt(index) index:下标&…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来计算相机的实时帧率(C#) Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在BGAPI SDK里通过函数获取相机帧率 Baumer工业相机通过BGA…

剑指 Offer 26. 树的子结构

思路: 先统计B数的非空节点数countB。然后前序遍历A,当遇到A的值和B的第一个值相等时,则进行统计左右结构和值都相等的节点数和sum,如果sum countB,则true。 /*** Definition for a binary tree node.* public class…

CSS 高频按钮样式

矩形与圆角按钮 正常而言&#xff0c;我们遇到的按钮就这两种 -- 矩形和圆角&#xff1a; 它们非常的简单&#xff0c;宽高和圆角和背景色。 <div classbtn rect>rect</div><div classbtn circle>circle</div>.btn {margin: 8px auto;flex-shrink: 0;…

网络设备中的配置文件管理

建立强大网络的第一步是为灾难和网络中断做好准备&#xff0c;许多企业在中断期间遭受损失&#xff0c;因为他们缺乏备份计划并且配置管理不达标&#xff0c;使用配置文件管理工具进行适当的配置文件管理不仅有助于处理网络中断&#xff0c;还有助于优化网络性能。 使用配置文…
最新文章