使用 Gunicorn 部署 Flask 项目

devtools/2024/10/9 8:23:36/

使用 Gunicorn 部署 Flask 项目

1. 简介

Flask 自带的 web 服务器仅适用于开发环境,无法满足生产环境的性能需求。在使用 app.run(host='0.0.0.0', port=5000) 启动时,Flask 会发出警告:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

WSGI 概念

  • WSGI:全称是 Web Server Gateway Interface(Web 服务器网关接口),是一种规范,用于定义 Web 服务器与 Web 应用程序之间的接口。
  • uWSGI:实现了 WSGI 和 uwsgi 协议的 Web 服务器。
  • Gunicorn:一个 Python WSGI HTTP 服务器,本博客将使用它来部署 Flask 应用。

2. 模块安装

使用 pip 安装 Gunicorn:

pip install gunicorn

3. 启动命令

3.1 命令行配置 Gunicorn 参数

main.py 为例,内容如下:

python">from flask import Flaskapp = Flask(__name__)@app.route('/', methods=['GET'])
def hello_world():return 'Hello Flask!'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

运行命令:

gunicorn -w 5 -b 0.0.0.0:5000 main:app
参数含义
  • -w:工作进程数
  • -b:绑定的地址和端口
  • main:Flask 启动的 Python 文件名
  • app:脚本中创建的 Flask 对象名

注意事项

  1. Windows 系统不支持 Gunicorn,可能会报错 ModuleNotFoundError: No module named 'fcntl',建议在 Linux 下运行。
  2. 如果 Flask 启动后请求很慢,可能是 Gunicorn 和 Flask-SocketIO 版本不兼容,需对应版本。

3.2 文件配置 Gunicorn 参数

3.2.1 进程 + 线程模式

在根目录新建配置文件 config.py

python"># 是否开启debug模式
debug = True
# 访问地址
bind = "0.0.0.0:5000"
# 工作进程数
workers = 2
# 工作线程数
threads = 2
# 超时时间
timeout = 600
# 输出日志级别
loglevel = 'debug'
# 存放日志路径
pidfile = "log/gunicorn.pid"
# 存放日志路径
accesslog = "log/access.log"
# 存放日志路径
errorlog = "log/debug.log"
# gunicorn + apscheduler场景下,解决多worker运行定时任务重复执行的问题
preload_app = True

运行命令:

gunicorn -c config.py main:app
配置文件参数详解
  • -c CONFIG:配置文件路径
  • -b ADDRESS:绑定的 IP 和端口
  • -w INT:工作进程数量,默认为 1
  • --threads INT:每个 worker 的线程数,默认为 1
  • --worker-class STRTING:工作模式,默认为 sync
  • --timeout INT:超时时间,超过设定时间后工作将被杀掉
  • --daemon:是否以守护进程启动,默认 false
  • --access-logfile FILE:访问日志文件路径
  • --error-logfile FILE:错误日志文件路径

3.2.2 进程 + 协程模式

config.py 中使用 Greenlet:

python">from gevent import monkey
monkey.patch_all()# 是否开启debug模式
debug = True
# 访问地址
bind = "0.0.0.0:5000"
# 工作进程数
workers = 2
# 设置协程模式
worker_class="gevent"
# 最大客户端并发数量
worker_connections=500
# 超时时间
timeout = 600
# 输出日志级别
loglevel = 'debug'
# 存放日志路径
pidfile = "log/gunicorn.pid"
# 存放日志路径
accesslog = "log/access.log"
# 存放日志路径
errorlog = "log/debug.log"
# gunicorn + apscheduler场景下
preload_app = True
# 设置环境变量
raw_env = ['PATH=/user/local/ffmpeg/bin']

运行命令:

gunicorn -c config.py main:app

其他部署web开发工具:
在生产环境中,Flask 和 Django 常用的部署工具有:

  1. Gunicorn:适用于 Flask 和 Django 的 WSGI HTTP 服务器,支持多进程和多线程。

  2. uWSGI:另一个流行的 WSGI 服务器,性能优越,支持多种配置。

  3. Nginx:作为反向代理服务器,通常与 Gunicorn 或 uWSGI 配合使用,处理静态文件和负载均衡。

  4. Docker:容器化部署工具,可以简化应用的打包和分发。

  5. Supervisor:用于管理和监控进程,确保应用在崩溃后自动重启。

结论

通过以上步骤,您可以轻松使用 Gunicorn 部署 Flask 项目,并根据需要调整配置以满足生产环境的需求。使用 Gunicorn 提供的多进程和多线程支持,可以有效提升应用的并发处理能力,确保服务的稳定性和性能。


http://www.ppmy.cn/devtools/91381.html

相关文章

c++----初识模板

大家好,这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧,我们都知道模板嘛,就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后,对于一些在c中的自定义函数,我们在…

sql 中的group by 与 聚合函数

聚合函数 MAX( )函数取指定字段的最大值; MIN( )函数取指定字段的最小值; SUM( ) 函数对指定字段的值进行求和; COUNT( ) 函数计算某个分组内数据的条数; AVG( ) 函数指定字段的值求平均数。 举例: …

探索人工智能大模型在工业领域的应用与发展

探索人工智能大模型在工业领域的应用与发展 前言测评总结 前言 人工智能大模型在工业领域的应用正逐渐展现出其巨大的潜力。大模型能够在工业知识问答、工程建模、数据分析、文档生成和代码理解等多个场景中发挥重要作用。 例如,在工业知识问答方面,大…

React管理系统整合Cesium避坑指南

花费了一周时间将React 升级到了最新版本18,同时整合Cesium三维模块到系统中,其中遇到了react 版本升级后模块删改,按照原来的引入方式无法使用的问题,以及Cesium 放入子路由一直404等问题 文章目录 一、系统版本依赖二、系统预览…

回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型

回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型 文章目录 前言回归预测|基于雪消融优化极端梯度提升树的数据回归预测Matlab程序SAO-XGBoost多特征输入单输出 含基础模型 一、SAO-XGBoost模型二、实验结果三、核心代码…

2024年AWS云服务器选择哪个区域最好?

在选择2024年AWS云服务器区域时,您需要根据您的业务需求、目标用户群体的位置、数据合规性要求、延迟需求以及成本预算等因素综合考虑。以下是九河云针对不同需求的建议: 北美区域 优势:北美区域,尤其是弗吉尼亚北部&#xff0c…

模拟退火的

题目链接 体验乱调参数而看天意的奇特体验 #include<bits/stdc.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pii; const int inf0x3f3f3f3f; const int N1e510; const int mod1e97; //#define int long…

我在高职教STM32——I2C通信入门(2)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…