如何在 Heroku 中运行 UVICORN?

Thr*_*t86 16 python heroku fastapi uvicorn

所以我已经想出了如何编写 fastAPI 并且我准备将我的脚本部署到我使用过 fastAPI ( https://fastapi.tiangolo.com/ ) 的heroku但是问题是当我向 heroku 发出请求时它只会返回:

<html>
  <head>
    <title>Internal Server Error</title>
  </head>
  <body>
    <h1><p>Internal Server Error</p></h1>

  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这意味着脚本已打开,但我看不到错误,并且我会说在本地它完全正常。

我无法看到问题所在的任何日志,但是我想说我的问题可能是我不确定我的procfile是否正确,因为我根本没有编辑它而且我对此很陌生,我在这里请问我如何能够在heroku中运行我的fastapi脚本?

我所知道的是,为了能够运行脚本,您必须使用命令uvicorn main:app --reload,如果您这样做,它将无法工作等py main.py我做错了什么?

Yag*_*nci 17

答案是正确的,但是在生产中使用 FastAPI 作为WSGIASGI工作人员一起运行是更好的选择,这就是为什么,我为此问题运行了一个基准,所以这是结果。

Gunicorn 与 Uvicorn 工人

Requests per second:    8665.48 [#/sec] (mean)
Concurrency Level:      500
Time taken for tests:   0.577 seconds
Complete requests:      5000
Time per request:       57.700 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

纯独角兽

Requests per second:    3200.62 [#/sec] (mean)
Concurrency Level:      500
Time taken for tests:   1.562 seconds
Complete requests:      5000
Time per request:       156.220 [ms] (mean)
Run Code Online (Sandbox Code Playgroud)

如您所见,每个请求的RPS(每秒请求)和响应时间存在巨大差异。

档案

Gunicorn 与 Uvicorn 工人

web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
Run Code Online (Sandbox Code Playgroud)

纯独角兽

web: uvicorn main:app --workers 4
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 Google Cloud Run,这种情况会发生什么变化?你会只使用一个 Uvicorn 工作线程并让 google 处理缩放吗? (2认同)

Hed*_*ide 15

我已经测试了你的设置,经过一些检查(以前从未使用过 Heroku)我猜你的 uvicorn 永远不会绑定到指定的端口(heroku-cli 命令heroku local对你有用吗?)

您的 Procfile 可能如下所示;

web: uvicorn src.main:app --host=0.0.0.0 --port=${PORT:-5000}
Run Code Online (Sandbox Code Playgroud)

此示例假设您的源代码位于名为“src”的子文件夹中,该文件夹为空__init__.py(表示 Python 模块,您可能希望将 src 添加到 PYTHONPATH,请参阅 app.json)并main.py包含您的 fastapi 应用程序;

import socket
import sys

from fastapi import FastAPI

app = FastAPI()

hostname = socket.gethostname()

version = f"{sys.version_info.major}.{sys.version_info.minor}"


@app.get("/")
async def read_root():
    return {
        "name": "my-app",
        "host": hostname,
        "version": f"Hello world! From FastAPI running on Uvicorn. Using Python {version}"
    }
Run Code Online (Sandbox Code Playgroud)

我已将我的工作示例添加到github,您可以在heroku 上查看(目前)


nav*_*ule 5

您还可以配置您的 FastAPI 以Gunicorn使用 uvicorn 作为工作进程运行。以下是您可以保留在 Heroku 使用的 Procfile 中的命令行,以启动和运行您的应用程序。以下命令将在 3 个工作进程上启动您的应用程序

web: gunicorn -w 3 -k uvicorn.workers.UvicornWorker main:app
Run Code Online (Sandbox Code Playgroud)

有关详细的分步视频,您可以访问此视频教程,其中详细介绍了如何在短短 6 分钟内在 Heroku部署 FastAPI。或者您可以从这篇博文中详细了解如何在 Heroku 上创建和部署基于 Python 的 FastAPI