基于gunicorn部署flask项目

2023-05-16

文章目录

        • 1、WSGI协议
        • 2、gunicorn介绍
        • 3、gunicorn安装
        • 4、gunicorn使用
          • 4.1 基于Flask创建python服务
          • 4.2 配置参数、启动应用服务
            • 4.2.1 命令行配置gunicorn参数
            • 4.2.2 文件配置gunicorn参数
        • 5、访问web服务器
        • 6、结束gunicorn服务进程

1、WSGI协议

Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。

2、gunicorn介绍

我们知道,python是单线程的语言,当进程阻塞时,后续请求将排队处理。

gunicorn是一个python WSGI http server,其优势在于它使用了pre-fork worker模式。gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,依靠操作系统来提供负载均衡。

3、gunicorn安装

gunicorn安装非常简单,使用命令pip install gunicorn即可:

pip install gunicorn

一般使用它,主要是为使用其异步的worker模型,还需要安装对应的异步模块:

pip install greenlet # 使用异步必须安装
pip install eventlet # 使用eventlet workers
pip install gevent   # 使用gevent workers

4、gunicorn使用

4.1 基于Flask创建python服务

这里使用gunicorn来部署一个flask项目举例,此处flask框架的使用不过多阐述,不是本文的重点。

如下例子,保存为app.py

from flask import Flask
app = Flask(__name__)

@app.route("/hello")
def hello():
    return "Hello World!"

注: 建议将应用程序运行所需的所有Python文件都放在顶层文件夹apps中。
将主入口程序命名为 app.py,将脚本中创建的Flask对象命名为 app (对应于部署命令 gunicorn -c gunicorn/config.py app:app 中的 app:app )。

FlaskApp  
    └── apps
        └── < .py files>
    └── gunicorn
        └── config.py
    ├── app.py
4.2 配置参数、启动应用服务

gunicorn通常使用的参数如下:

1)-c CONFIG,--config=CONFIG
指定一个配置文件(py文件)

2)-b BIND,--bind=BIND
设定服务需要绑定的端口。建议使用HOST:PORT。

3)-D,--daemon
后台进程方式运行gunicorn进程

4)-w WORKERS,--workers=WORKERS
工作进程的数量

5)-k WORKERCLASS,--worker-class=WORKERCLASS
工作进程类型,包括sync(默认),eventlet,gevent,tornado,gthread,gaiohttp

6)--backlog INT
最大挂起的连接数

7)--log-level LEVEL
日志输出等级

8)--access-logfile FILE
访问日志输出文件

9)--error-logfile FILE
错误日志输出文件
4.2.1 命令行配置gunicorn参数

当所需配置的参数较少时,我们可以直接在shell中输入启动配置,比如:

gunicorn -w 3 -b 127.0.0.1:5000 app:app

此处app:app中,第一个app为flask项目实例所在的包,第二个app为生成的flask项目实例。

4.2.2 文件配置gunicorn参数

当参数较多或者不方便使用命令行时,我们也可以将参数写在配置文件中,下面举列说明配置文件 gunicorn/config.py 的写法。

bind = "127.0.0.1:5000"
workers = 2

运行以下命令:

gunicorn -c gunicorn/config.py app:app

看到如下信息表明运行成功:

xxx@xxx:~/projects/project_name$ gunicorn -c gunicorn/config.py app:app
[2021-10-13 17:19:41 +0800] [19950] [INFO] Starting gunicorn 20.1.0
[2021-10-13 17:19:41 +0800] [19950] [INFO] Listening at: http://127.0.0.1:5000 (19950)
[2021-10-13 17:19:41 +0800] [19950] [INFO] Using worker: sync
[2021-10-13 17:19:41 +0800] [19968] [INFO] Booting worker with pid: 19968

也可以使用 nohup 使应用始终保持后台运行,并记录相应的日志信息:

nohup gunicorn -c  $(pwd)/config.py app:app &> ./logs/uwsgi.log &

运行结果和使用命令行参数结果一样。

gunicorn配置文件是一个python文件,因此可以实现更复杂的逻辑,如下:

# gunicorn.conf.py
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing

bind = '127.0.0.1:5000'  #绑定ip和端口号

backlog = 512 #监听队列
timeout = 30  # 响应耗时(单位为秒)

worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1    #进程数
threads = 2 #指定每个进程开启的线程数

loglevel = 'info' #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'    #设置gunicorn访问日志格式,错误日志无法设置

"""
其每个选项的含义如下:
h          remote address
l          '-'
u          currently '-', may be user name in future releases
t          date of the request
r          status line (e.g. ``GET / HTTP/1.1``)
s          status
b          response length or '-'
f          referer
a          user agent
T          request time in seconds
D          request time in microseconds
L          request time in decimal seconds
p          process ID
"""
accesslog = "/log/access.log"      #访问日志文件
errorlog = "/log/error.log"        #错误日志文件

5、访问web服务器

访问地址:127.0.0.1:5000/hello
查看相关页面可查看是否启用成功。
在这里插入图片描述

6、结束gunicorn服务进程

使用 ps -ef | grep gunicorn 命令找出gunicorn所有进程。

[root@VM_0_12_centos ~] ps -ef|grep gunicorn
xxx   19950 17074  0 17:13 pts/2    00:00:00 /home/xxx/anaconda3/bin/python /home/xxx/anaconda3/bin/gunicorn -c gunicorn/config.py app:app
xxx   19968 19950  0 17:13 pts/2    00:00:00 /home/xxx/anaconda3/bin/python /home/xxx/anaconda3/bin/gunicorn -c gunicorn/config.py app:app
xxx   20264 20141  0 17:13 pts/1    00:00:00 grep --color=auto gunicorn

然后使用 kill -9 进程ID 命令来杀掉相关进程

[root@VM_0_12_centos ~] kill -9 19950
[root@VM_0_12_centos ~] kill -9 19968
[root@VM_0_12_centos ~] ps -ef | grep gunicorn

杀掉进程后,稍等几秒,再使用ps -ef | grep gunicorn查看,发现gunicorn服务进程已全部杀掉。

【参考博客】:

  • https://zhuanlan.zhihu.com/p/88422780
  • https://www.cnblogs.com/shijingjing07/p/9110619.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于gunicorn部署flask项目 的相关文章

  • Flask 消息闪烁错误 -flask.debughelpers.FormDataRoutingRedirect

    当我运行我的烧瓶代码时 当前出现以下错误 Flask debughelpers FormDataRoutingRedirect FormDataRoutingRedirect 请求已发送到此 URL http localhost 5000
  • 如何使用ssl启动flask_socketio应用程序?

    我应该如何使用 SSL 将 app run 转换为 sockio run 我有下面的应用程序启动代码与 Flask 开发服务器一起运行 if name main app run ssl context ssl cert ssl key 我现
  • Flask 管理数据库连接:内存:

    我有一个烧瓶应用程序 需要存储请求中的一些信息 这些信息的生命周期非常短暂 如果服务器重新启动 我就不再需要它了 所以我真的不需要持久性 我读过了here https stackoverflow com questions 11113903
  • Flask-SQLAlchemy 多态关联

    我有两个主表role and users 以及关于users我让 3 个关联到表operator teacher and student 到目前为止 我是这样做的 class Role db Model tablename roles id
  • 是否可以从 Python 运行 Falcon 应用程序?

    我正在将我的代码从 Flask 移动到 Falcon 一个小烦恼是我似乎无法找到从 Flask 运行我的基于 Falcon 的应用程序的方法 main 方法 在我的 Flask 应用程序中 我有这个 if name main app run
  • time.sleep、Flask 和 I/O 等待

    使用时time sleep Flask 请求会被阻止吗 我的 Flask 端点之一启动了一个长处理子任务 在某些情况下 可以等待任务完成并在同一请求中返回结果 而不是异步执行工作 在这种情况下 我的 Flask 应用程序启动该过程 然后等待
  • 不能在jinja2宏中使用current_user?

    我使用 Flask Login 它提供了current user模板中的对象 我想编写一个宏来显示评论表单或登录链接 具体取决于用户是否登录 如果我直接在模板中使用此代码 它会起作用 if current user is authentic
  • 使用主宰器将实时数据发送给客户端

    我尝试使用 Flask 的主宰框架 以便按照 Flask 代码片段将实时信息发送到客户端浏览器http flask pocoo org snippets 80 http flask pocoo org snippets 80 当我尝试为我的
  • Flask_login - 当前用户

    我正在使用烧瓶登录我的烧瓶应用程序中的扩展用于登录用户 您必须知道 此扩展有一个变量 用于存储当前用户 除了测试之外 该代码运行良好 当我测试代码时 使用unittest 我注册了一个 测试用户 并登录 但是当前用户变量不保留登录的用户 这
  • 如何通过API(最好使用flask-restplus)封送腌制对象?

    我有一个完整记录并完成的 API 使用 Flask restplus 在 python 3 5 flask 中构建 我想添加一大块功能 返回一个腌制对象作为我的响应的一部分 欢迎非特定于 Flask restplus 的通用解决方案 但由于
  • Flask-Session 扩展与默认会话

    我在用着 from flask import session app route def main page if session get key print session exist session get key else print
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • 一起使用 Flask 和 Tornado?

    我是以下的忠实粉丝Flask 部分是因为它很简单 部分是因为它有很多扩展 http flask pocoo org extensions 然而 Flask 是为了在 WSGI 环境中使用而设计的 而 WSGI 不是非阻塞的 所以 我相信 它
  • 管理员(仅)用户注册,Flask-Security

    我目前正在使用 Flask Security 包括 Flask WTForms Flask SQLalchemy 和 Flask Login 为 Web 应用程序构建登录 我已经能够相当轻松地设置大部分登录流程 包括忘记密码 但是我想让用户
  • GET /socket.io/?EIO=3&transport=polling&t=MniHjPM HTTP/1.1

    我有一个简单的 Flask 聊天应用程序 我正在从教程中测试它 据说我只需要使用 python app py 命令运行它 但是当我通过访问它时http 本地主机 5000 http localhost 5000我不断收到这样的消息 我希望能
  • 如何将画布转换为图像以上传到烧瓶?

    好吧 我正在尝试将调整大小的画布图像作为文件上传到 Flask 首先我尝试使用canvas toDataURL 将其转换为 base64 字符串 然后尝试使用以下命令将其作为图像上传formdata使用AJAX 就没那么幸运了 然后我尝试使
  • 构建 Flask docker 镜像时分配端口

    我最近使用 Flask 创建了一个应用程序 并将 py 文件放入 docker 容器中 然而 我对人们分配端口的在线案例感到困惑 首先在我写的 py 文件的底部 if name main app run host 0 0 0 0 port
  • Flask 扩展未在 app.extensions 中注册

    我想访问在我的 Flask 应用程序上注册的一些扩展 我尝试使用app extensions 但我初始化的一些扩展不在字典中 from flask import current app current app extensions get

随机推荐

  • Hive lag()与lead() 函数

    lag与lead函数是跟偏移量相关的两个分析函数 xff0c 通过这两个函数可以在一次查询中取出同一字段的前N行的数据 lag 和后N行的数据 lead 作为独立的列 从而更方便地进行进行数据过滤 这种操作可以代替表的自联接 xff0c 并
  • WebService简单案例实例

    本周工作日即将结束 xff0c 下周项目经理安排了一项任务可能需要使用到webservice xff0c 但本人之前尚未使用过 xff0c 网上查了一些案例看了看 在此小记一篇留作日后回首也希望可以帮助到查看者朋友 1 什么是WebServ
  • Java中CountDownLatch介绍与应用

    正如每个Java文档所描述的那样 xff0c CountDownLatch是一个同步工具类 xff0c 它允许一个或多个线程一直等待 xff0c 直到其他线程的操作执行完后再执行 在Java并发中 xff0c countdownlatch的
  • Windows下搭建 Rust 开发环境

    Rust 支持很多的集成开发环境 xff08 IDE xff09 或开发专用的文本编辑器 查看官网公布支持的开发工具 Rust 的编译工具依赖 C 语言的编译工具 xff0c 可以使用 Microsoft C 43 43 生成工具 或者 M
  • ubuntu安装mysql错误处理

    1 错误信息 W GPG error http repo mysql com apt ubuntu xenial InRelease The following signatures were invalid KEYEXPIRED 1487
  • 如何安装 SUSE Linux Enterprise Server 15 SP4

    SUSE Enterprise Linux Server SLES 是一种现代的模块化 Linux 发行版 xff0c 主要为服务器和大型机开发 它专注于支持生产工作负载 xff0c 通常由大型组织用于托管和运行应用程序 SUSE还支持传统
  • Xcode 之nib文件

    在iOS 开发中 xff0c 不可避免的肯定会接触到interface builder xff0c 也就是IB窗口 这儿IB就是使用nib文件储存GUI资源 这儿所说的nib文件是一种数据文件 xff0c 用于存储可在应用程序需要时使用的一
  • 出现 mkdir() Permission denied 问题解决

    正常我们在写项目的时候 xff0c 本地可以可以使用 xff0c 部署到服务器为什么就出现这个错误了呢 xff1f 因为我们服务器使用的是Linux系统 xff0c 默认的目录权限没有全部开启的 xff0c 造成执行创建文件的时候报错 xf
  • 报错A non well formed numeric value encountered(Thinkphp5时间戳自动转换问题)

    数据库表字段设置 datetime类型 xff0c 渲染的时候系统会自动进行转换 xff0c datetime类型再做一次转换就出现了 A non well formed numeric value encountered 错误 解决方法
  • 【开箱即用】VirtualBox Ubuntu20.04.6、22.04.2虚拟机下载

    简介 今天继续我们的开箱即用系列 为了简化Ubuntu虚拟机的制作 xff0c 减少重复劳动 xff0c 提高生产效率 xff0c 本公众号提供了基于VirtualBox制作的Ubuntu纯净虚拟机 xff0c 供学习交流使用 下载 Ubu
  • anaconda安装后桌面无快捷方式

    在安装目录的Anaconda3 Scripts中找到需要的exe文件 xff0c 生成快捷方式到桌面即可 如果想要改变快捷方式的图标 xff0c 可以在桌面快捷方式上右键选择属性 xff0c 点击更改图标 浏览 输入图标地址 在安装的Ana
  • 洛谷 [P1825 [USACO11OPEN]Corn Maze S] {搜索|BFS} 奋斗的珂珂~

    题目描述 This past fall Farmer John took the cows to visit a corn maze But this wasn t just any corn maze it featured severa
  • 个人对测试的理解--自动化UI测试

    系列文章目录 整理下个人对测试的一些想法和理解 xff0c 个人之见 文章目录 系列文章目录整体思路UI测试WEB UIselenium快速入门 APP UIappnium快速入门 airtest快速入门 桌面应用 UIpywinauto快
  • 什么是对象?什么是面向对象程序设计?面向对象语言有什么优点?

    在初学面向对象语言的时候 xff0c 很多书都会有这样的句子 一切都是对象 那么对象究竟是什么呢 xff1f 是不是一切的事物都叫对象 xff1f 但这里的对象并不是我们日常生活中的对象 xff08 事物 xff09 xff0c C 中我们
  • 远程桌面无法复制东西

    今天突然用远程桌面复制的时候发现无法复制东西 xff0c 然后上网查了一下 xff0c 解决办法就是重启一下他 xff1a rdpclip exe 重启方法就是打开任务管理器 xff0c 杀掉rdpclip exe xff0c 然后再运行他
  • ubuntu 20.0.4 qt 程序打包发布及解决 xcb 加载错误的解决方法

    ubuntu 中如何通过 批处理命令进行 qt 程序的打包发布 xff0c 参见 博文 xff1a https blog csdn net qq21497936 article details 85396652 ops request mi
  • mamp pro apache 中文目录浏览乱码

    解决办法 xff1a 打开mamp pro apache配置文件httpd conf xff0c 在任意一行后加入 xff1a span class hljs attribute IndexOptions Charset span 61 s
  • PyTorch入门二:LSTM实现MNIST手写数字识别

    参考博客 xff1a https blog csdn net winycg article details 88937583 LSTM Long Short Term Memory xff0c 长短时记忆网络 xff0c 主要用于传统RNN
  • Python之Networkx详解

    文章目录 1 安装Networkx2 Networkx的基本使用2 1 导入networkx2 2 创建Graph2 3 给Graph添加边2 3 Graph基本信息获取2 4 Graph的绘制2 5 Graph的其他内置算法 3 其他3
  • 基于gunicorn部署flask项目

    文章目录 1 WSGI协议2 gunicorn介绍3 gunicorn安装4 gunicorn使用4 1 基于Flask创建python服务4 2 配置参数 启动应用服务4 2 1 命令行配置gunicorn参数4 2 2 文件配置guni