Ich möchte Ereignisse an einen Flashen-Server mit Socket IO senden. Aber wenn ich meine App über einen nxginx-Proxy ausliege, kommen die Ereignisse nicht an.Nginx + socketio: Ereignisse nicht eintreffen
Mein Flask Server app.py sieht wie folgt aus:
var socket = io('http://my.ip.address.it');
...
socket.emit('message', 'here is my message 1');
Dies funktioniert, wenn ich meinen Server auf localhost bereitstellen:
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return "this is the index function"
@socketio.on('message')
def handle_message(message):
print('received message: ' + message)
if __name__ == '__main__':
socketio.run(app,debug=True)
Ereignisse vom Client wie diese gesendet werden. Aber wenn ich es über nginx auf einer EC2-Instanz deploye, kommen Ereignisse, die von einem Client ausgegeben werden, nur gelegentlich an.
Mein nginx Proxy-Konfiguration wie folgt aussieht:
server {
listen 80;
server_name my.ip.add.it;
location/{
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
location /socket.io {
include proxy_params;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:8000/socket.io;
}
}
Und ich beginne meine Server-Anwendung wie folgt aus:
gunicorn app:app -b 127.0.0.1:8000
Wie kann ich richtig mein Flask Server-Setup?
SocketIO automatisch Herabstufungen von WebSockets zu lange Polling und dann Polling, wenn es Probleme hat. Sie können möglicherweise von Ihrem SocketIO-Client im Frontend feststellen, ob dies stattfindet. – jwg
scheint es so zu sein, wie ich sehe: 'POST http://my.ip.add.it/socket.io/?EIO=3&transport=polling&t=LwVSz8l&sid=4c6a4a2ebb3a4faebfbf3c451924a1ac 400 (BAD REQUEST)'. Wenn ich die Abfrage deaktiviere, erhalte ich einen Websocket-Handshake-Fehler. Irgendwelche Ideen, wie man das löst? – bear
Ich würde sowohl /var/log/nginx/error.log als auch das Gunicorn-Protokoll betrachten (standardmäßig an stderr gesendet) und sehen, ob Sie diesen 400 Fehler finden können. Wenn Sie es in Gunicorn finden, sollte es eine Rückverfolgung oder eine Fehlermeldung geben. Wenn Sie es nicht in Gunicorn finden, befindet sich möglicherweise etwas im Nginx-Fehlerprotokoll, das erklärt, warum die Anforderungen fehlschlagen. – jwg