如何在多个端口上运行 FastAPI 应用程序?

Ani*_*aha 14 python gunicorn docker fastapi uvicorn

我有一个 FastAPI 应用程序,正在使用 Uvicorn 以编程方式在端口 30000 上运行。现在我也想在端口 8443 上运行相同的应用程序。相同的应用程序需要在这两个端口上运行。我怎样才能在Python代码中做到这一点?

最小可重现代码:

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/healthcheck/")
def healthcheck():
    return 'Health - OK'

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=30000)
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", ports=[30000,8443])
Run Code Online (Sandbox Code Playgroud)

说明:我的应用程序将在我的组织 Azure Kubernetes 服务上运行。在端口 30000 上运行的应用程序保留用于内部 HTTP 流量,在 8443 上运行的应用程序映射到 Kubernetes 服务的 443 以暴露给外部流量。

更多详细信息:我将从此应用程序创建一个 Docker 容器,其想法是包括

CMD ["python3", "app.py"]
Run Code Online (Sandbox Code Playgroud)

最后运行应用程序。我正在寻找一种解决方案,它可以提供更改 python 代码 () 的方法uvicorn.run(app, host="0.0.0.0", ports=[30000,8443]),也可以更改 Dockerfile 中的 CMD 命令,例如此 GitHub 问题评论-gunicorn -k uvicorn.workers.UvicornWorker -w 1 --bind ip1:port1 --bind ip2:port2 --bind ip3:port3

小智 16

就我而言,我使用了上面相同的命令,但做了一些小改动。我需要在私人端口上公开其他路线。

app = FastAPI()
app2 = FastAPI()
Run Code Online (Sandbox Code Playgroud)

然后,在run.sh文件中,我有:

uvicorn app.main:app --reload --host 0.0.0.0 --port $PORT & uvicorn app.main:app2 --reload --host 0.0.0.0 --port $PORT_INTERNAL_APP
Run Code Online (Sandbox Code Playgroud)


小智 9

其中一种选择是使用 docker-compose 并在可变环境中传输端口。您只需要部署应用程序的多个实例。该版本尚未准备好用于生产,只是一个最小的示例。

docker-compose.yml
Dockerfile
main.py
requirements.txt
Run Code Online (Sandbox Code Playgroud)

主要.py:

from fastapi import FastAPI
import uvicorn
import os

app = FastAPI()


@app.get("/healthcheck/")
def healthcheck():
    return 'Health - OK'


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=int(os.getenv('APP_PORT')))

Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python:3.8-slim

WORKDIR /usr/src/app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD [ "python", "./main.py" ]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '2'

services:
  internal-app:
    image: internal-app
    environment:
      APP_PORT: "3000"
    build:
      context: .
      dockerfile: ./Dockerfile
    restart: unless-stopped
    network_mode: host

  external-app:
    image: external-app
    environment:
      APP_PORT: "8443"
    build:
      context: .
      dockerfile: ./Dockerfile
    restart: unless-stopped
    network_mode: host
Run Code Online (Sandbox Code Playgroud)

要求.txt:

uvicorn
fastapi

Run Code Online (Sandbox Code Playgroud)

开始 -docker-compose up -d --build

将启动 2 个应用程序,每个应用程序都在其自己的端口上。


Ani*_*aha 3

以下解决方案对我有用。它在后台运行一个 Gunicorn 进程,然后运行另一个进程将其绑定到两个端口。其中一种将使用 HTTP,另一种可以使用 HTTPS。

Dockerfile:

FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
ENTRYPOINT ./docker-starter.sh
EXPOSE 30000 8443
Run Code Online (Sandbox Code Playgroud)

docker-starter.sh:

gunicorn -k uvicorn.workers.UvicornWorker -w 3 -b 0.0.0.0:30000 -t 360 --reload --access-logfile - app:app & gunicorn --access-logfile - -k --ca_certs ca_certs.txt uvicorn.workers.UvicornWorker -w 3 -b 0.0.0.0:8443 -t 360 --reload --access-logfile - app:app
Run Code Online (Sandbox Code Playgroud)

python 应用程序可以保持最小化:

FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
ENTRYPOINT ./docker-starter.sh
EXPOSE 30000 8443
Run Code Online (Sandbox Code Playgroud)