【问题标题】:Docker FastAPI load balancing with NGINXDocker FastAPI 负载均衡与 NGINX
【发布时间】:2021-05-06 20:26:58
【问题描述】:

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

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

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

我的文件结构如下:

mainApp
  app
     main.py
  Dockerfile
  requirements.txt

nginx
  Dockerfile
  nginx.conf

还有代码:

ma​​in.py

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;
}
}

【问题讨论】:

    标签: docker nginx load-balancing fastapi


    【解决方案1】:

    uvicorn 在泊坞窗图像will by default use the same number of workers as CPUs available on the server 中。默认的最小worker数是2(所以如果你只有一个核心,仍然会启动两个worker来处理请求)。

    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 cores) 运行多个应用程序,并且您有一个 FastAPI 您知道不需要高性能的应用程序。而你不 想浪费服务器资源。你可以让它每人使用 0.5 个工人 CPU核心。例如:

    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个。这个 是为了避免性能不佳和阻塞应用程序(服务器 应用程序)在小型机器(服务器机器/云/等)上。这可以是 使用 WEB_CONCURRENCY 覆盖。

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

    【讨论】:

    • 谢谢 - 这太棒了。 gethostname 帮助我看到,一旦我使用 nginx 负载均衡器启动了两个不同的应用程序容器,它确实以循环模式运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多