首页 > 解决方案 > Docker FastAPI 负载均衡与 NGINX

问题描述

我正在寻找一些关于负载平衡我正在研究的 Web API 的方向/批评。

这是我目前正在做的事情,但我有疑问:

  1. 我使用“docker build -t app ”在 mainApp 中构建了第一个图像(应用程序) 。
  2. 我使用“ docker build -t nginx ”在 nginx 文件夹中构建了应该是负载均衡器。
  3. 我在 Windows 上的 Docker Desktop 中的单独容器上运行图像;8080 端口上的应用程序和 8090 端口上的 nginx。
  4. 当我在网络浏览器中加载 localhost:8090 时,它似乎确实在不同的进程 ID 之间切换,但它通常在 3 而不是我试图在 nginx.conf 文件中声明的 2 之间。这让我相信它没有真正正确设置,并且进程 ID 返回具有误导性。有没有更好的方法来测试这个?

我的文件结构如下:

mainApp
  app
     main.py
  Dockerfile
  requirements.txt

nginx
  Dockerfile
  nginx.conf

和代码:

主文件

app = FastAPI()

@app.get("/")
def read_root():
    return {"Served From": str(os.getpid())}

Dockerfile(在 mainApp 内)

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

RUN pip install --upgrade pip

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . /app

Dockerfile(在 nginx 内)

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf

COPY nginx.conf /etc/nginx/conf.d/

nginx.conf

upstream loadbalancer {
    server 192.168.80.12:8080;
    server 192.168.80.12:8081;
}

server {
    listen 80;

    location / {
    proxy_pass http://loadbalancer;
}
}

标签: dockernginxload-balancingfastapi

解决方案


uvicorn在 docker 映像中,默认情况下将使用与服务器上可用的 CPU 相同数量的工作人员。默认情况下的最小工人数是 2(所以如果你只有一个核心,仍然会启动两个工人来处理请求)。

然后,worker pid 将根据哪个 uvicorn worker 处理您的连接而改变。

WORKERS_PER_CORE 此映像将检查运行容器的当前服务器中有多少 CPU 内核可用。

它将工作人员的数量设置为 CPU 核心数乘以该值。

默认情况下:

1

你可以这样设置:

docker run -d -p 80:80 -e WORKERS_PER_CORE="3" myimage

如果您在具有 2 个 CPU 内核的服务器中使用值 3,它将运行 6 个工作进程。

您也可以使用浮点值。

因此,例如,如果您有一个运行多个应用程序的大型服务器(例如,具有 8 个 CPU 内核),并且您有一个您知道不需要高性能的 FastAPI 应用程序。而且您不想浪费服务器资源。你可以让它每个 CPU 核心使用 0.5 个工人。例如:

docker run -d -p 80:80 -e WORKERS_PER_CORE="0.5" myimage

在具有 8 个 CPU 内核的服务器中,这将使其仅启动 4 个工作进程。

注意:默认情况下,如果 WORKERS_PER_CORE 为 1 且服务器只有 1 个 CPU 核,则不会启动 1 个单个 worker,而是启动 2 个。这是为了避免性能不佳和阻塞应用程序(服务器应用程序)在小型机器(server machine/云/等)。这可以使用 WEB_CONCURRENCY 覆盖。

相反,您可以使用socket.gethostname()获取服务 docker 容器的主机名并查看是否不同。另一种选择是查看容器本身的日志——图像默认启用了访问日志(或自己将一些内容输出到标准输出)并查看两个容器都接收到请求。您可以使用docker logs查看容器的日志


推荐阅读