我正在尝试使用 Docker 和 Nginx 对 2 个 Python 应用程序进行负载平衡。
App 1 使用 UWSGI 运行,App 2 使用默认 Python 服务器运行(我使用 App 2 的默认服务器只是为了测试目的。最终两者都应该使用 UWSGI)
层次结构如下:
-app1
---app.py
---Dockerfile
---app.ini
-app2
---app.py
---Dockerfile
-nginx
---Dockerfile
---nginx.conf
-docker-compose.yml
app.py(对于 app1 和 app2 来说都是相同的)
from flask import request, Flask
import json
app1 = Flask(__name__)
@app1.route('/')
def hello_world():
return 'Salam alikom, this is App1 (App2 for app2) :)'
if __name__ == '__main__':
app1.run(host='0.0.0.0')
app1/Dockerfile
FROM python:3
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip install -r requirements.txt
COPY . /
ENTRYPOINT ["uwsgi", "app.ini"]
app1/应用程序.ini
[uwsgi]
wsgi-file = app.py
callable = app
socket = :5000
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true
app2/Dockerfile
FROM python:3
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip install -r requirements.txt
COPY . /
ENTRYPOINT [ "python3" ]
CMD [ "app.py" ]
nginx/nginx.conf
upstream loadbalancer {
least_conn;
server 192.168.100.2:9001;
server 192.168.100.2:9002;
}
server {
location / {
proxy_pass http://loadbalancer;
}
}
docker-compose.yml
version: '3'
services:
app1:
build: ./app1
ports:
- "9001:5000"
app2:
build: ./app2
ports:
- "9002:5000"
nginx:
build: ./nginx
ports:
- "9003:80"
depends_on:
- app1
- app2
当我运行 docker compose 文件时,会创建应用程序 1、应用程序 2 和 nginx 服务器的容器。当我访问端口 9003 上的负载均衡器时,只显示应用程序 2。当我手动转到端口 9001 时,我收到invalid request block size: 21573 (max 4096)...skip
应用程序 1 的错误消息。
如果我也对应用程序 1 使用默认的 Python 服务器,那么负载平衡可以正常工作,但我不想使用它,因为默认的 python 服务器仅用于开发环境。
有人可以帮忙吗?
答案1
我遇到了与无效块大小非常相似的问题,在我的情况下,它阻止对应用程序进行身份验证并给出“502 错误网关”错误。
长话短说,我在 uwsgi.ini 文件中添加了以下行
[uwsgi]
为了清晰起见省略的内容
缓冲区大小 = 8192
现在听起来你需要增加到 32,768 (32x1024),甚至更多。我只比默认值 (4,096) 稍微超出了一点点 (~5,000)。
希望这能有所帮助。顺便说一下,这里还有更多关于这个问题的内容:
https://stackoverflow.com/questions/15878176/uwsgi-invalid-request-block-size