使用NGINX实现Docker FastAPI负载平衡
我正在寻找一些关于负载平衡的指导/评论,我正在开发一个web API 以下是我目前正在做的事情,但我有疑问:使用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之间切换,但通常
以及守则: 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;
}
}