2017-09-18 8 views
0

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?

+1

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

+0

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

+1

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

Antwort

1

Sie müssen die Socket.IO-Konfiguration zu nginx hinzufügen. Siehe https://flask-socketio.readthedocs.io/en/latest/#using-nginx-as-a-websocket-reverse-proxy für die Details, aber hier ist das Beispiel von diesem Link:

server { 
    listen 80; 
    server_name _; 

    location/{ 
     include proxy_params; 
     proxy_pass http://127.0.0.1:5000; 
    } 

    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:5000/socket.io; 
    } 
} 
+0

Ich habe versucht, den Socket.IO-Teil zur nginx-Konfiguration hinzuzufügen, wie in dem von Ihnen angegebenen Link vorgeschlagen (siehe mein bearbeiteter Beitrag), aber immer noch das gleiche Verhalten. irgendwelche Ideen, was ich noch falsch mache? – bear

+0

Sie müssen Protokolle im Browser, Nginx und Server suchen, um zu sehen, wo Nachrichten verloren gehen. Tritt die Socket.IO-Verbindung auf? Wenn ja, passiert das Upgrade auf WebSocket? – Miguel

Verwandte Themen