2017-09-18 13 views
0

ソケットioを使用してフラスコサーバーにイベントを送信します。しかし、nxginxプロキシ経由でアプリケーションをデプロイすると、イベントは届きません。Nginx + socketio:イベントが到着しない

マイフラスコサーバapp.pyは次のようになります。

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) 

イベントは次のようにクライアントから送信されます。

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

私はローカルホスト上の私のサーバーを展開するときにこれが動作します。しかし、それをnginx経由でEC2インスタンスにデプロイすると、クライアントから出されたイベントはときどきしか届きません。

マイnginxのプロキシの設定は次のようになります。

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

そして、私はこのような私のサーバーアプリを起動します。どうすればセットアップ私のフラスコサーバ

gunicorn app:app -b 127.0.0.1:8000 

正しく?

+1

SocketIOは自動的に長いポーリングして、ポーリングにWebSocketをからダウングレードします。これが起こっている場合は、フロントエンドのSocketIOクライアントから通知することができます。 – jwg

+0

私が見ているように、それはそうであるようです: 'POST http://my.ip.add.it/socket.io/?EIO=3&transport=polling&t=LwVSz8l&sid=4c6a4a2ebb3a4faebfbf3c451924a1ac 400(BAD REQUEST)'。ポーリングを無効にすると、websocketハンドシェイクエラーが発生します。任意のアイデアをどのようにこれを解決するには? – bear

+1

私は/var/log/nginx/error.logとgunicornのログ(デフォルトでstderrに送られます)を見て、この400のエラーが見つかるかどうかを調べます。 gunicornで見つけた場合は、トレースバックまたはエラーメッセージが表示されます。あなたがgunicornで見つからない場合は、nginxエラーログに何かがあり、要求が失敗する理由が説明されているかもしれません。 – jwg

答えて

1

nginxにSocket.IOの設定を追加する必要があります。詳細については、https://flask-socketio.readthedocs.io/en/latest/#using-nginx-as-a-websocket-reverse-proxyを参照してくださいが、ここではそのリンクからの例である:それは問題がある場合

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

あなたが提供したリンク(私の編集されたポストを参照)に示唆されているように、Socket.IOの部分をnginxの設定に追加しようとしましたが、同じ動作をします。私がまだ間違っていることは何ですか? – bear

+0

メッセージが失われる場所を確認するには、ブラウザ、nginx、およびサーバーのログを参照する必要があります。 Socket.IOの接続は行われますか?はいの場合、WebSocketへのアップグレードは実行されますか? – Miguel

関連する問題