Borzi
Borzi

Reputation: 577

Error when running Flask application with web sockets and Gunicorn

When running my app on the local server using gunicorn, I get the following error log:

[2019-06-10 20:12:20 +0200] [34160] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 191, in handle_request
    six.reraise(*sys.exc_info())
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/six.py", line 625, in reraise
    raise value
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 183, in handle_request
    resp.close()
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 409, in close
    self.send_headers()
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 329, in send_headers
    util.write(self.sock, util.to_bytestring(header_str, "ascii"))
  File "/Users/user/Documents/project/venv/lib/python3.6/site-packages/gunicorn/util.py", line 304, in write
    sock.sendall(data)
OSError: [Errno 9] Bad file descriptor

My gunicorn configuration is the following, I executed it using gunicorn -w 4 -b 0.0.0.0:8080 uwsgi:app config=config.ini:

[server:main]
workers = 4
worker_class = 'eventlet'
bind = '0.0.0.0:8080'
reload = False
daemon = True
timeout = 1200
port = 8080

Code for web socket connection via Flask-SocketIO:

app = Flask(__name__)
Session(app)
socketio = SocketIO(app)

I am using Flask-SocketIO, for now I am just trying to get the socket framework working over the wsgi server without Nginx on my local machine. Any suggestions on what the problem may be? Cannot piece it together from these error logs - thanks in advance for any advice!

Upvotes: 5

Views: 4176

Answers (1)

Borzi
Borzi

Reputation: 577

I had to specify the worker as eventlet, now it is working on the local machine with gunicorn. I did that by running:

gunicorn -w 1 -b 0.0.0.0:8080 app:app --worker-class eventlet --reload

Upvotes: 8

Related Questions