使用NGINX实现Docker FastAPI负载平衡

使用NGINX实现Docker FastAPI负载平衡,docker,nginx,load-balancing,fastapi,Docker,Nginx,Load Balancing,Fastapi,我正在寻找一些关于负载平衡的指导/评论,我正在开发一个web API 以下是我目前正在做的事情,但我有疑问: 我使用“docker build-t app”在mainApp内部构建第一个图像(应用程序) 我使用“docker build-t nginx”在nginx文件夹中构建了负载平衡器 我在Windows的Docker桌面上的单独容器上运行图像;端口8080上的应用程序和端口8090上的nginx 当我在web浏览器中加载localhost:8090时,它似乎在不同的进程ID之间切换,但通常

我正在寻找一些关于负载平衡的指导/评论,我正在开发一个web API

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

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


    以及守则: main.py

    app = FastAPI()
    
    @app.get("/")
    def read_root():
        return {"Served From": str(os.getpid())}
    
    Dockerfile(在mainApp内部)

    Dockerfile(在nginx内部)

    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图像中的uvicorn。默认情况下,工作进程的最小数量为2(因此,如果您只有一个内核,则仍将启动两个工作进程来处理请求)

    然后,工作进程pid将根据哪个uvicorn工作进程处理您的连接而更改

    每个内核的工人数此映像将检查有多少个CPU内核 在运行容器的当前服务器中可用

    它将工人数量设置为CPU核心数量 乘以这个值

    默认情况下:

    1

    您可以将其设置为:

    docker run-d-p 80:80-e WORKERS\u PER_CORE=“3”myimage

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

    也可以使用浮点值

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

    docker run-d-p 80:80-e WORKERS\u PER\u CORE=“0.5”myimage

    在服务器中 对于8个CPU核,这将使它只启动4个工作进程

    注意:默认情况下,如果WORKERS\u PER\u CORE是1,而服务器只有1 CPU核心,而不是启动1个工人,它将启动2个。这 是为了避免性能差和阻塞应用程序(服务器 应用程序)在小型机器上(服务器/云/等)。这可能是 使用WEB_并发重写


    相反,您可以使用
    socket.gethostname()
    获取提供服务的docker容器的主机名,并查看其是否不同。另一个选项是查看容器本身的日志-默认情况下,映像启用了访问日志(或者自己将一些内容输出到stdout),并查看两个容器都接收请求。你可以。

    谢谢-这太棒了。gethostname帮助我看到,在我使用nginx负载平衡器启动两个不同的应用程序容器后,它确实在循环模式下运行。
    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
    
    FROM nginx
    
    RUN rm /etc/nginx/conf.d/default.conf
    
    COPY nginx.conf /etc/nginx/conf.d/
    
    upstream loadbalancer {
        server 192.168.80.12:8080;
        server 192.168.80.12:8081;
    }
    
    server {
        listen 80;
    
        location / {
        proxy_pass http://loadbalancer;
    }
    }