docker - Docker FastAPI 负载均衡与 NGINX
问题描述
我正在寻找一些关于负载平衡我正在研究的 Web API 的方向/批评。
这是我目前正在做的事情,但我有疑问:
- 我使用“docker build -t app ”在 mainApp 中构建了第一个图像(应用程序) 。
- 我使用“ docker build -t nginx ”在 nginx 文件夹中构建了应该是负载均衡器。
- 我在 Windows 上的 Docker Desktop 中的单独容器上运行图像;8080 端口上的应用程序和 8090 端口上的 nginx。
- 当我在网络浏览器中加载 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;
}
}
解决方案
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
查看容器的日志。
推荐阅读
- php - 我尝试使用验证码创建一个表单,但它不显示验证码
- c# - 如何在 Xamain 中使用 MVVM 在列表视图中显示数据?
- python - 合并字典列表
- json - 解组拆分 JSON 消息
- gremlin - 我怎样才能使这种遍历更有效?
- typescript-generics - 有没有办法将泛型信息从父函数传递到子函数的 typeof 函数?
- android - Android - 自定义工具栏中的中心徽标
- javascript - 有没有办法在不使用节点的情况下使用 webpack(或`next dev`)运行 Next.js 站点?
- python - pygame.sprite.Group() 做什么
- android - Pressable 在嵌套视图中不起作用——反应原生