uwsgi-nginx-flask-docker icon indicating copy to clipboard operation
uwsgi-nginx-flask-docker copied to clipboard

Nginx refused to connect and showing bad gateway error.

Open razaaliabid87 opened this issue 3 years ago • 3 comments

I am working on Nginx, Flask_SocketIO, and uWSGI+Gevent. Whenever I run my code in the docker container I always ended up with a 502 Bad Gateway error. But the flask socketio application runs perfectly in development when I don't use Nginx and uWSGI. Bad Gateway nginx.conf

server {
    listen 80;
    location /ztest {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_pass http://0.0.0.0:8085;
    }
    location /socket.io {
    
        proxy_pass http://0.0.0.0:8085/socket.io;
        proxy_redirect off;
        proxy_buffering off;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location /static/ {
        location ~* \.(js|css)$ {
            expires 30d;
        }
        expires 1h;
        alias /home/%(username)s/my_app_name/static/;
        access_log off;
        log_not_found off;
    }
}

uWSGI configuration resides in the .ini file. app.ini

[uwsgi]
wsgi-file = application.py
callable = app
mount = /=application.py
gevent-early-monkey-patch = 1
gevent = 1000
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
manage-script-name = true
die-on-term = true
http = :8085
http-websockets = true
single-interpreter = true

docker-compose.yml

version: "3.9"
services:
  nginx:
    build: ./nginx
    container_name: nginx
    restart: always
    ports:
      - "80:80"
 
  ztest:
    build: ./ztest
    container_name: ztest
    restart: always
    environment:
      - APP_NAME=Myztest
    expose:
      - 8085

application.py.

import gevent
gevent.monkey.patch_all()

from flask_socketio import SocketIO, emit
from flask import Flask, render_template, url_for, copy_current_request_context
from random import random
from time import sleep
from threading import Thread, Event

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True

socketio = SocketIO(app, async_mode=None, logger=True, engineio_logger=True)
thread = Thread()
thread_stop_event = Event()

def randomNumberGenerator():
    print("Making random numbers")
    while not thread_stop_event.isSet():
        number = round(random()*10, 3)
        print(number)
        socketio.emit('newnumber', {'number': number}, namespace='/test')
        socketio.sleep(5)

@app.route('/ztest')
def index():
    return render_template('index.html')

@socketio.on('connect', namespace='/test')
def test_connect():
    global thread
    print('Client connected')
    thread = socketio.start_background_task(randomNumberGenerator)

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

if __name__ == '__main__':
    socketio.run(app, host="0.0.0.0", port=8085)

requirements.txt

bidict==0.21.2
cffi==1.14.6
click==8.0.1
colorama==0.4.4
Flask==1.0.2
Flask-SocketIO==4.3.1
gevent==21.1.2
gevent-websocket==0.10.1
greenlet==1.1.0
gunicorn==20.1.0
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
pycparser==2.20
python-engineio==3.13.2
python-socketio==4.6.0
six==1.16.0
Werkzeug==2.0.1
zope.event==4.5.0
zope.interface==5.4.0
uWSGI==2.0.19.1

When I build and run nginx and ztest docker containers, I am unable to reach my desired endpoint. Nginx gives me a Bad Gateway error. Here are the logs.

nginx       | 2021/07/19 21:09:10 [error] 23#23: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: , request: "GET /ztest HTTP/1.1", upstream: "http://0.0.0.0:8085/ztest", host: "192.168.10.7"

Please help me to get out of this problem thank you in anticipation.

razaaliabid87 avatar Jul 19 '21 21:07 razaaliabid87

I seem to have this same problem. I've built a bunch of web apps on this stack in the past and have never gotten this error before...but it's random...most of the time it doesn't work...but occationally it does...I'll do some digging.

Nevertheless, thank you very much for this stack!

mullenkamp avatar Sep 09 '21 04:09 mullenkamp

I suspect this is caused by the issue raised here: #192

mullenkamp avatar Sep 09 '21 04:09 mullenkamp

I get this iff I set app.config['SECRET_KEY'] = ... in my flask app.

Edit. Never mind, I checked my flask logs and the app was crashing due to a bug in my python script.