2017-09-18 4 views
0

Je souhaite envoyer des événements à un serveur flask avec le socket io. Mais lorsque je déploie mon application via un proxy nxginx, les événements n'arrivent pas.Nginx + socketio: les événements n'arrivent pas

app.py Mon serveur Flask ressemble à ceci:

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) 

Les événements sont envoyés à partir du client comme celui-ci:

var socket = io('http://my.ip.address.it'); 
... 
socket.emit('message', 'here is my message 1'); 

Cela fonctionne quand je mon serveur sur déployer localhost. Mais quand je le déploie sur une instance EC2, via nginx, les événements émis par un client n'arrivent qu'occasionnellement.

Ma config proxy nginx ressemble à ceci:

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; 
    } 
} 

Et je commence mon application serveur comme ceci:

gunicorn app:app -b 127.0.0.1:8000 

Comment puis-je configurer mon serveur Flask correctement?

+1

SocketIO déclasse automatiquement websockets à longue interrogation, puis vote si elle a des problèmes. Vous pourriez être en mesure de dire à partir de votre client SocketIO dans le frontend si cela se produit. – jwg

+0

il semble que ce soit le cas, comme je le vois: 'POST http://my.ip.add.it/socket.io/?EIO=3&transport=polling&t=LwVSz8l&sid=4c6a4a2ebb3a4faebfbf3c451924a1ac 400 (BAD REQUEST)'. Lorsque je désactive l'interrogation, j'obtiens une erreur d'établissement de liaison Web. Des idées pour résoudre ce problème? – bear

+1

Je regarderais à la fois /var/log/nginx/error.log et le journal gunicorn (envoyé à stderr par défaut) et voir si vous pouvez trouver cette erreur 400. Si vous le trouvez dans gunicorn, il devrait y avoir un traceback ou un message d'erreur. Si vous ne le trouvez pas dans gunicorn, il peut y avoir quelque chose dans le journal des erreurs nginx qui explique pourquoi les demandes échouent. – jwg

Répondre

1

Vous devez ajouter la configuration Socket.IO à nginx. Voir https://flask-socketio.readthedocs.io/en/latest/#using-nginx-as-a-websocket-reverse-proxy pour les détails, mais voici l'exemple de ce lien:

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

J'ai essayé d'ajouter la partie Socket.IO à la configuration nginx comme suggéré dans le lien que vous avez fourni (voir mon article édité), mais obtenez toujours le même comportement. des idées que je fais encore mal? – bear

+0

Vous devez consulter les journaux du navigateur, de nginx et du serveur pour voir où les messages sont perdus. Est-ce que la connexion Socket.IO se produit? Si oui, la mise à niveau vers WebSocket a-t-elle lieu? – Miguel