ソケット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
正しく?
SocketIOは自動的に長いポーリングして、ポーリングにWebSocketをからダウングレードします。これが起こっている場合は、フロントエンドのSocketIOクライアントから通知することができます。 – jwg
私が見ているように、それはそうであるようです: 'POST http://my.ip.add.it/socket.io/?EIO=3&transport=polling&t=LwVSz8l&sid=4c6a4a2ebb3a4faebfbf3c451924a1ac 400(BAD REQUEST)'。ポーリングを無効にすると、websocketハンドシェイクエラーが発生します。任意のアイデアをどのようにこれを解決するには? – bear
私は/var/log/nginx/error.logとgunicornのログ(デフォルトでstderrに送られます)を見て、この400のエラーが見つかるかどうかを調べます。 gunicornで見つけた場合は、トレースバックまたはエラーメッセージが表示されます。あなたがgunicornで見つからない場合は、nginxエラーログに何かがあり、要求が失敗する理由が説明されているかもしれません。 – jwg