I am trying to load balance 2 Python apps using Docker and Nginx.
App 1 is run using UWSGI and App 2 is run using default Python Server (I used default server for App 2 just for testing purposes. At the end of the day both should use UWSGI)
The hierarchy is as follows:
-app1
---app.py
---Dockerfile
---app.ini
-app2
---app.py
---Dockerfile
-nginx
---Dockerfile
---nginx.conf
-docker-compose.yml
app.py (for both app1 and app2 is the same)
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/app.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
When i run my docker compose file, containers for app 1, app 2 and the nginx server are created. When i access the load balancer on port 9003, only app 2 shows. When i manually go to port 9001, i get the error message invalid request block size: 21573 (max 4096)...skip
for app 1.
If i use default Python server for app 1 too then the load balancing works fine but i don't want to use that since the default python server is only for development environment.
Can someone please help ?
I was having a very similar problem with the invalid block size, in my case it was preventing authentication happening to the app and giving a "502 Bad Gateway" error.
Anyway to cut a long story short I added the following line into my uwsgi.ini file
[uwsgi]
stuff omitted for clarity
buffer-size = 8192
Now by the sounds of things you are going to need to go up to 32,768 (32x1024), maybe even more. I was only a smidge outside (~5,000) of the default (4,096).
Hope that helps. Incidentally there is a bit more on the issue here:
https://stackoverflow.com/questions/15878176/uwsgi-invalid-request-block-size