socket.io
私のウェブサイトでチャットルームを作るのに私は自分のコンピュータでそれを実行しても問題はありませんが、プロダクションサーバで実行するとsocket.io.js
はエラー:サーバーとWebサイトがポート80
でnginx
の後ろにポート8080
でリッスンしているWebSocketハンドシェイクは400に応答しますが、まだ動作しています
クライアントのために、私は[email protected]
使用しています
WebSocket connection to 'ws://myWebsite.com/socket.io/?EIO=3&transport=websocket&sid=1qtzy4QRde6G-PHkAAAU' failed: Error during WebSocket handshake: Unexpected response code: 400
、すべてがエラーメッセージを除いて正常に動作しますが、チャットルームは、まだ機能しています、それはとてもです奇妙な。
私は、スタックオーバーフローの上にいくつかの同様の問題を検索しました、と示唆したソリューションは、すでに私のnginx
設定(/etc/nginx/sites-enabled/myWebsite.com
)は次のとおりです。
server {
listen 80;
server_name myWebsite.com;
location/{
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
}
Meteor WebSocket handshake error 400 with nginx Meteor WebSocket connection to 'ws://.../websocket' failed: Error during WebSocket handshake: Unexpected response code: 400
チャットルームは、まだ動作しますが、私はまだエラーメッセージを取り除きたい
参考のため、以下はsocket.io
関連コードです:
// I use angular.js as the front-end framework
function Socket (socketFactory, $rootScope) {
var ioSocket = io.connect(window.location.host);
var socket = socketFactory({ioSocket : ioSocket});
return {
on: function (eventName, callback) {
socket.on(eventName, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
},
emit: function (eventName, data, callback) {
socket.emit(eventName, data, function() {
var args = arguments;
$rootScope.$apply(function() {
if (callback) {
callback.apply(socket, args);
}
});
});
}
};
}
Socket.$inject = ['socketFactory', '$rootScope'];
angular.module('core').factory('Socket', Socket);
Socket.on('new message', function (data) { ... });
したがって、ソケットはどのように接続されますか? 2番目のリクエストを送信していますか? WebSocketにアップグレードするのか、それともxhrにバックアップするのですか? –
どのように動作しているのか分かりません。2つのブラウザタブを開きました。両方とも400応答でしたが、どちらもお互いからメッセージを受け取ることができました – kitlee