本文使用的是FastAPI框架,从这篇文章中可以了解到:

  • 如何配置并将FastAPI应用部署到AIF上
  • 为什么以及何时应该使用 FastAPI、Gunicorn 和 Uvicorn
  • 如何以及为何设置 Gunicorn+Uvicorn 组合作为 ASGI 服务器

目录

一、直接上手

二、前言

三、技术框架介绍

3.1 FastAPI

3.2 Uvicorn

3.3 Gunicorn

3.4 ASGI/WSGI

3.4.1 ASGI

3.4.2 WSGI

3.4.3 对比

四、总结一下


一、直接上手

操作简单一步到位!

from fastapi import FastAPIimport uvicorn
app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

启动命令

使用进程管理器确保你以弹性方式运行运行多个进程,你可以执行服务器升级而不会丢弃客户端的请求。

一个进程管理器将会处理套接字设置,启动多个服务器进程,监控进程活动,监听进程重启、关闭等信号。

1. 使用uvicorn 

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

Uvicorn 提供一个轻量级的方法来运行多个工作进程,比如 `--workers 4`,但并没有提供进行的监控。

uvicorn 在单进程上使用异步协程是有优势的、但是如果接口方法是同步的则走的多进程模式、也就是 workers 的数量、 这个时候 uvicorn 不如 gunicorn、性能上会有些限制。

2. 使用gunicorn 

gunicorn main:app -b 0.0.0.0:8001 -w 4 -k uvicorn.workers.UvicornWorker  
#  `-w` 表示 worker 数量,`-k` 表示使用的 worker 类型,`-b` 表示绑定的地址和端口。
  • Gunicorn 是成熟的,功能齐全的服务器,可以设定进程的类型,Uvicorn 可以作为 Gunicorn的进程类型
  • Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点。
  • Guicorn 可以进行进程管理,如果进程死掉会重启一个新的进程以维持工作进程的数量,你可能动态增加或减少进程数量,平滑地重启工作进程,或者升级服务器而无需停机
  • 使用这种组合,Gunicorn 将充当进程管理器,监听端口和IP。它会将接收到的数据传输到运行 Uvicorn 类的工作进程,然后,Uvicorn 将数据传输给 FastAPI。
  • 在生产环境中,Guicorn 大概是最简单的方式来管理 Uvicorn 了,生产环境部署我们推荐使用 Guicorn 和 Uvicorn 的 worker 类

到这,你就可以部署并启动运行一个FastAPI的服务了,如果你只是想知道怎么操作,看到这里就可以了。但是,如果你还想知道为什么要用uvicorn和gunicorn,那么请继续往下看


如果你对uvicorn和gunicorn的概念还不了解,可以先基于上面的内容思考这么一个问题:uvicorn有 worker 的功能, 为什么不直接用uvicorn,还要 gunicorn 挂 uvicorn worker 启动然后带着这个问题看一下内容~

二、前言

FastAPI 是用于开发API应用最受欢迎的Python库之一,用于开发API。它以其出色的性能和易用性而闻名。如果你在网页应用中使用机器学习模型,那么它很可能是你首选的工具。

NGINX、Gunicorn 和 Uvicorn 都是经过实践验证的技术,常被用作反向代理和ASGI服务器来部署Python网页应用。如果你熟悉 Django 或 Flask,你可能之前听说过它们中的一些。

三、技术框架介绍

3.1 FastAPI

FastAPI 是一个现代的、高性能的 Web 框架,用于使用 Python 构建 API,并基于标准类型提示。

 

它具有以下主要特点:

  • 高效运行:借助 Starlette 和 pydantic,FastAPI 提供了与 NodeJS 和 Go 类似的出色性能。FastAPI比Flask快得多,它实际上是Python最快的Web框架之一。唯一比 FastAPI 更快的框架是 Starlette(FastAPI 实际上是基于 Starlette 构建的)。
  • 快速开发:它可以显著提高开发速度。
  • 减少错误:减少了人为错误的可能性。
  • 直观易用:支持强大的编辑器功能、自动补全和更少的调试时间。
  • 简单易学:设计简单明了,您可以花更少时间阅读文档。
  • 减少重复代码量:最大限度地减少了代码重复。
  • 健壮可靠:提供生产就绪的代码和自动生成交互式文档功能。
  • 基于标准化:遵循 API、OpenAPI 和 JSON 模式等开放标准。

该框架旨在优化开发人员体验,使您能够以简洁的代码构建具备最佳实践且适合生产环境使用的 API。

3.2 Uvicorn

与Flask框架不同,FastAPI不包含任何内置的开发服务器。因此,我们需要Uvicorn。它实施ASGI标准,速度快如闪电。ASGI 代表 异步服务器网关接口

Uvicorn是Python的ASGI Web服务器实现。

3.3 Gunicorn

Gunicorn是用于Python应用程序的WSGI服务器的一种实现。

Gunicorn是一个符合WSGI标准的Web服务器,用于Python应用程序,它接收从客户端发送到Web服务器的请求,并将其转发到Python应用程序或Web框架(如Flask或Django)上,以便为请求运行适当的应用程序代码。

3.4 ASGI/WSGI

ASGI(Asynchronous Server Gateway Interface)和 WSGI(Web Server Gateway Interface)都是Python Web应用程序和Web服务器之间的接口标准,它们定义了Web服务器如何与Web应用程序进行通信

3.4.1 ASGI

  • ASGI 是一个更现代、异步的接口标准,旨在支持异步Web应用程序,例如基于async/await的Python框架。
  • 它允许Web应用程序处理大量并发请求而不会阻塞,从而提高了性能和响应速度。
  • 一些常见的ASGI框架包括FastAPI、Starlette和Tornado。

ASGI服务:

  •  Uvicorn 是一个ASGI服务器,用于运行ASGI应用程序。它是一个轻量级、快速且易于部署的服务器,广泛用于FastAPI和其他ASGI框架。

  • Hypercorn: Hypercorn 也是一个ASGI服务器,与Uvicorn类似,用于运行ASGI应用程序。它具有一些额外的特性,如支持UNIX套接字(UNIX socket)。

  • Daphne: Daphne 是一个ASGI服务器,专门设计用于运行Django应用程序。它允许将Django应用程序部署为ASGI应用程序。

3.4.2 WSGI

  • WSGI 是一个较早的接口标准,用于同步Web应用程序
  • 它允许Python Web应用程序与Web服务器之间进行通信,但不能有效处理异步操作。
  • 一些常见的WSGI框架包括Django、Flask和Bottle。

WSGI服务:

  • uWSGI: uWSGI 是一个WSGI服务器,广泛用于运行WSGI应用程序。它支持多种应用程序容器和部署模式,可以与各种Web服务器配合使用。

  • Gunicorn: Gunicorn(Green Unicorn)是一个WSGI服务器,专为Django应用程序设计。它通过多工作进程实现并发处理请求,提高了应用程序的性能。

3.4.3 对比

主要区别在于:

  • 同步 vs. 异步: WSGI 是同步接口,适用于同步Web应用程序。ASGI 是异步接口,适用于异步Web应用程序。ASGI允许应用程序处理长连接、WebSocket等异步操作。

  • 性能: 由于ASGI的异步特性,它更适合处理大量并发请求和高性能需求。WSGI更适合传统的同步Web应用程序。

  • 框架兼容性: ASGI通常用于FastAPI、Starlette、Tornado等异步框架,而WSGI通常用于Django、Flask、Bottle等同步框架。

四、总结一下

现在回到最开始提的问题,可以知道,Uvicorn 确实可以单独作为 ASGI 服务器运行,而 Gunicorn 通常用于运行 WSGI 应用程序。但是,当你将它们结合在一起使用时,会有一些特定的好处:

1. 稳定性:Gunicorn 作为一个长期存在且经过良好测试的项目,它的稳定性和健壮性是有保障的。通过将 Gunicorn 与 Uvicorn 结合使用,可以利用 Gunicorn 的管理能力和稳定性,以及 Uvicorn 的异步性能。
2. 进程管理:Gunicorn 提供了一些强大的进程管理功能,例如工作进程的启动、停止和重启。当系统负载增加时,它可以更好地管理资源,而 Uvicorn 单独运行时可能没有这些特性。
3. 部署的简化:对于那些已经习惯使用 Gunicorn 来部署 WSGI 应用程序的组织来说,将 Gunicorn 与 Uvicorn 结合使用可以简化迁移到 ASGI 的过程。团队可以利用现有的 Gunicorn 部署、监控和日志记录基础设施。
4. 配置灵活性:Gunicorn 提供了许多配置选项和插件,可以方便地自定义应用程序的行为。与 Uvicorn 结合使用时,你可以利用这些灵活性,并允许在同一台机器上同时运行 WSGI 和 ASGI 应用程序。
5. 负载均衡:Gunicorn 能够在多个工作进程之间进行负载均衡。这不仅能够更好地利用多核 CPU ,还可以增加系统的可扩展性和冗余性。

总而言之,尽管 Uvicorn 单独使用具有优势,但将 Gunicorn 与 Uvicorn 结合使用可以提供额外的稳定性、灵活性和管理功能。这种组合在具有大量流量和需要高可用性的生产环境中可能尤为有用。

参考:

FastAPI + NGINX + Gunicorn:一步一步教你部署一个高性能的Python网页应用

快如闪电的异步服务器Uvicorn

Gunicorn和Uvicorn

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐