web-dev-qa-db-ja.com

予期しない応答コード:AppFogでsocket.ioを使用すると502エラーが発生する

エラー

ユーザーが開くと http://sync.aws.af.cm/ 、Google Chrome JavaScriptコンソールに表示されます(数秒以内):

Unexpected response code: 502 error

アプリは、ユーザーがページを更新した後でも、テキスト領域の内容を記憶している必要があります。アプリはローカルで動作しますが、AppFogにアップロードすると動作しません。問題は、502エラーであると思われます。

この場合、何がこのエラーを引き起こす可能性があるか知っていますか?

私が試したこと

説明されているように ここ に、クライアントのscript src=<path_to_socket_io>パスを/socket.io/socket.io.jsからnode_modules/socket.io/node_modules/socket.io-client/dist/socket.io.jsに変更しようとしましたが、変更されました助けません。

AppFogではなくHerokuでアプリを提供しようとしましたが、その場合、socket.ioバージョンを指定したにもかかわらず、ここで説明されている問題 here が発生し続けました。 0.9.6。

以下の質問も見てきましたが、これまでのコメントは役に立たないようです。

socket.ioが接続/ WebSocketで502 Bad Gatewayを作成しています無効

Socket.IO node.js websocket接続が無効なポート8081

node.jsが期待どおりに機能しないsocket.io

関連するサーバーコード

関連するサーバーコードは次のとおりです。

var server = http.createServer(function (req, res) {
  ...
});

var io = require('socket.io').listen(server);

// Define events that can be triggered by the client
io.sockets.on('connection', function (socket) {
  socket.on('setServerVariable', function (value) {
    ...
  });
  ...
});

server.listen(process.env.VCAPP_APP_PORT || 3000);

関連するクライアントコード

<script src="/socket.io/socket.io.js"></script>

<script>
  window.onload = function () {
    ...
    var socket = io.connect(window.location.hostname);
    socket.emit('getServerVariable');
    ...
  };
...

サーバーログ

$ af logs sync

====> /logs/stdout.log <====

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized veNnUVtoDTIz-oudG7Pa
debug: setting request GET /socket.io/1/websocket/veNnUVtoDTIz-oudG7Pa
debug: set heartbeat interval for client veNnUVtoDTIz-oudG7Pa
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared heartbeat interval for client veNnUVtoDTIz-oudG7Pa
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/websocket/6AKyhROUNjqujk_uG7Pb
debug: set heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130465
debug: setting poll timeout
debug: client authorized for 
debug: clearing poll timeout
debug: xhr-polling writing 1::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130724
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling received data packet 5:::{"name":"getServerVariable"}
debug: clearing poll timeout
debug: xhr-polling writing 5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
server.js: getServerVariable: 
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130980
debug: setting poll timeout
debug: clearing poll timeout
debug: xhr-polling writing ���23���5:::{"name":"printLog"}���39���5:::{"name":"setItemValue","args":[""]}���23���5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504131261
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: clearing poll timeout
debug: xhr-polling writing 8::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling closed due to exceeded duration
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504151659
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
17
Andrew Liu

AppFogはまだWebSocketをサポートしていません。 Nodesterの最近の買収に続いて、彼らはそれが数ヶ月以内に来ると発表しました。

io.set('transports', ['xhr-polling']);を追加することで、トランスポートをajaxロングポーリングに設定するだけです。デフォルトでは、Socket.ioは、ブラウザーの機能と現在の接続に基づいて最適なトランスポートを決定します。 Websocketは、利用可能な場合は理想的ですが、利用できない場合、Socket.ioは他のトランスポートの中でもxhr-pollingにフォールバックします。

CloudFlareを使用しているときに、同じ502 unexpected response / bad gatewayエラーが発生しました。CloudFlareは、nginxベースのインフラストラクチャを介してWebSocket接続をプロキシすることもできません(2014年現在、プレミアムプランを使用している場合、CloudflareはWebSocketをプロキシできます)。

30
Wes Johnson