当前位置: 首页 > 知识库问答 >
问题:

使用NGINX实现Docker FastAPI负载平衡

翟功
2023-03-14

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

以下是我目前正在做的,但我在质疑:

  1. 构建的第一个图像(应用程序)内的主应用程序使用docker构建-t应用程序。
  2. 我使用docker build-t nginx构建了nginx文件夹内的负载均衡器。
  3. 我在Windows上的Docker Desktop中的单独容器上运行图像;端口8080上的应用程序和端口8090上的nginx。
  4. 当我在网络浏览器中加载localhost:8090时,它似乎确实在不同的进程标识之间切换,但通常是在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(主应用内)

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。形态

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

server {
    listen 80;

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

共有1个答案

章振
2023-03-14

默认情况下,docker映像中的uvicorn将使用与服务器上可用CPU相同数量的工作线程。默认情况下,工作进程的最小数量为2(因此,如果您只有一个内核,则仍将启动两个工作进程来处理请求)。

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

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

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

默认情况下:

1

你可以这样设置:

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

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

也可以使用浮点值。

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

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

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

注意:默认情况下,如果WORKERS_PER_CORE是1,服务器只有1个CPU核心,而不是启动1个单个工人,它将启动2个。这是为了避免小机器(服务器机器/云/等)上的性能不佳和阻塞应用程序(服务器应用程序)。这可以使用WEB_CONCURRENCY重写。

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

 类似资料:
  • 我正在尝试使用前端NGINX 1.6.2负载平衡器来平衡API Manager 1.9.0。我有两台服务器: 服务器A(xxx.xxx.xxx.xx1和xxx.xxx.xxx.x11)-公共和私有IP服务器B(xxx.xxx.xxx.xx2和xxx.xxx.xxx.x22)-公共和私有IP API Manager 1.9.0和所有四个组件都在服务器B上安装和启动。 我在服务器A上安装了NGINX,

  • 本文向大家介绍详解Centos7.2安装Nginx实现负载平衡,包括了详解Centos7.2安装Nginx实现负载平衡的使用技巧和注意事项,需要的朋友参考一下 下载Nginx 到官网下载源码文件,地址:http://nginx.org/en/download.html,选择最新版本。本人下载的地址为:http://nginx.org/download/nginx-1.10.2.tar.gz,可用w

  • 本文向大家介绍Centos7.2安装Nginx实现负载平衡的方法,包括了Centos7.2安装Nginx实现负载平衡的方法的使用技巧和注意事项,需要的朋友参考一下 下载Nginx 到官网下载源码文件,地址:http://nginx.org/en/download.html,选择最新版本。本人下载的地址为:http://nginx.org/download/nginx-1.10.2.tar.gz,可

  • 本文向大家介绍使用Nginx实现负载均衡的策略,包括了使用Nginx实现负载均衡的策略的使用技巧和注意事项,需要的朋友参考一下 一、nginx简介 nginx是一个高性能的HTTP服务器和反向代理服务器。它起初是俄罗斯人Igor Sysoev开发的,至今支撑者俄罗斯的很多大型的网站。 二、nginx支持的三种负载均衡策略 轮询:将请求依次轮询发给每个服务器。 最少链接:将请求发送给持有最少活动链接

  • 本文向大家介绍nginx+tomcat实现负载均衡,使用redis session共享,包括了nginx+tomcat实现负载均衡,使用redis session共享的使用技巧和注意事项,需要的朋友参考一下 环境准备 1、准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: 准备一台tomcat服务器,先准备java环境,安装jdk步骤省略 然后分别安装3个tomcat

  • 我需要一些nginx负载平衡方面的帮助。我有一个docker实例,它服务于一个静态网页,它有两个容器,比如说192.168。1.1:8081 - 当我输入这些IP地址192.168.1.1时,这些IP必须服务于我的两个站点之间的负载。 在我的Nginx中,我必须为此设置两个文件 Nginx。conf,在这些文件中,我必须包含我的默认值。conf文件。违约conf文件包含以下信息。 当我键入192.