【问题标题】:WebSocket connection to 'wss://' Error during WebSocket handshake: Unexpected response code: 400WebSocket 连接到“wss://”WebSocket 握手期间出错:意外的响应代码:400
【发布时间】:2018-03-30 13:25:53
【问题描述】:

我在运行于express 的node.js 应用程序中使用socket.io。

在本地版本 (localhost) 上一切正常,但是当我切换到生产服务器(使用自定义证书通过 https 提供服务)时,我在浏览器控制台中收到以下错误:

websocket.js:112 WebSocket connection to 'wss://infranodus.com/socket.io/?EIO=3&transport=websocket&sid=j_WBxkPY_RlpF9_ZAANP' failed: Error during WebSocket handshake: Unexpected response code: 400

我进行了一项研究 (issue referenced here),结果发现这是因为我的应用程序/托管服务提供商阻止了像 wss 这样的连接,而我的 socket.io 依靠 AJAX 发出请求(功能正常,但是有时会有错误)。

所以我想问你是否可以对我的应用程序进行修改以消除此错误?

仅供参考,目前对http://infranodus.com 的所有请求都被转发(通过静态.htaccess)到https://infranodus.com 和我的app.js 文件(服务器激活的部分看起来像这样):

var http = require('http');

var app = express();

var server = http.Server(app);
var io = require('socket.io')(server);

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

以及我在前端文件中需要套接字的方式:

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

然后

var socket = io();

也许问题是我使用http 而不是https 在我的node.js 应用程序中激活服务器?但我不想切换到那个,因为我不知道我的证书存储在哪里,我不想过多地更改后端代码。

更新(2018 年 10 月 21 日): 我们发现问题出在 with nginx server 并且由于一些不允许用户编辑 nginx 服务器的托管服务提供商的限制,websockets 过于安全协议被阻止或出现 400 错误。最好在 sockets.io 中解决这个问题,因为这是许多用户遇到的问题。有什么想法吗?

重现问题:请打开您的 Javascript 控制台并转到 https://infranodus.com/news/english

源代码: https://github.com/noduslabs/infranodus

【问题讨论】:

  • 你在哪里托管你的应用程序?,你有多个服务器,还是只有一个?
  • @MarcosCasagrande 我只有一台服务器,我将它托管在 Webfaction 上
  • 你的 node 应用前面有 nginx 服务器吗?
  • 我想是的,@MarcosCasagrande - 我该如何检查?
  • 如果您不确定,可能无法控制它,您将无法更改任何内容。 stackoverflow.com/questions/29043879/socket-io-with-nginx

标签: node.js sockets nginx websocket socket.io


【解决方案1】:

我用这个解决了:

var socket = io.connect("http://localhost:3000", {
   forceNew: true,
   transports: ["polling"],
});

【讨论】:

  • 谢谢你,伙计。我用这个解决方案解决了这个问题。
  • 是的,这就像一个魅力。谢谢
【解决方案2】:

检查您是否使用 express-status-monitor 作为 express 上的中间件,这会使 WebSocket 的第一次(请求)握手时的 http 调用失败,如果不是代理(nginx)或类似的其他因素

看here有关此错误的更多详细信息

【讨论】:

  • 哦,是的,我在那个页面上到处都是,但那里没有帮助。是的,这是一个 nginx 问题,如果我可以访问我的 nginx 服务器,我可以解决这个问题,但是当我无权访问时如何解决它?我开发此代码,以便人们也可以将其安装在其他服务器上,但并非所有服务器都有能力进入该级别的配置,那该怎么办?
  • 当我遇到这个问题时,尝试分解每个连接到 express 的中间件,然后通过一一删除它们来检查握手问题是否已解决。首先,您应该检查您的应用程序是否不是问题。
【解决方案3】:

为您的初始连接使用安全 URL,即使用“https://”代替“http://”。如果选择了 WebSocket 传输,那么 Socket.IO 也应该自动使用 "wss://" (SSL) 进行 WebSocket 连接。

如果你在调用 io() 时没有指定任何 URL,因为它默认尝试连接到为页面提供服务的主机,你必须提供 url 或更改为 https

  var socket = io.connect('https://localhost', {secure: true}); //remote url

【讨论】:

    【解决方案4】:

    我有同样的错误。

    我决定访问infranodus.com/socket.io/?EIO=3&transport=websocket&sid=j_WBxkPY_RlpF9_ZAANP,它返回消息“会话 ID 未知”。

    您是否使用了多个节点?如果是这种情况,请参考网站https://socket.io/docs/using-multiple-nodes/。

    正如官网所说,

    如果您计划在不同的 进程或机器,您必须确保请求关联 使用特定的会话 ID 连接到发起的进程 他们。

    这是由于某些传输,如 XHR 轮询或 JSONP 轮询 依赖于在生命周期内触发多个请求 “插座”。未能启用粘性平衡将导致 害怕:

    Error during WebSocket handshake: Unexpected response code: 400

    按照说明重新配置 Nginx 配置,然后尝试像这样调整 Express

    let port = parseInt(your_port) + parseInt(process.env.NODE_APP_INSTANCE);
    server.listen(port, console.log("Server running "+port));
    

    如果它改变了什么,请告诉我们:)

    【讨论】:

    • 嘿,不,我不使用多个节点。我认为在我的特殊情况下,问题是我无法在其之间配置的 nginx 服务器,因为 WebFaction 托管不允许这样做......不过找到一个解决方法会很好......
    • 谢谢,这是我的情况,我需要修改 Nginx 配置,因为 Nginx 阻止建立连接。
    【解决方案5】:

    如果这对你有用,试试这两种方法

    试试这个方法一:

    我遇到了同样的问题。经过 30 分钟调试后,我通过启用 ALB(应用程序负载均衡器)粘性解决了这个问题。它对我有用。

    试试这个方法2:

    // Client side adding transport param:
    var socket = io('http://localhost:3000', { transports: ['websocket'] });
    

    您可以根据您的域设置此值“http://localhost:3000”。

    【讨论】:

    • 如何启用?
    • 转到负载均衡器 > 选择目标组 > 下方有一个编辑按钮 > 编辑按钮并启用粘性。
    • 您可能在亚马逊上,但我的服务器在 WebFaction 上。另外,我尝试了您提供的设置,但没有任何作用...
    • 是的,我正在使用亚马逊,它运行良好。尝试一些故障排除
    【解决方案6】:

    我在后端更新包时遇到了这个问题,python socketio,但在前端没有这样做。

    但是当我到处更新软件包时,问题就解决了。 这是版本中的问题

    当返回 400 错误时,我在导航到链接后在浏览器中发现了此错误 “客户端正在使用不受支持的 Socket.IO 或 Engine.IO 协议版本”

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2020-01-24
      • 2014-05-02
      • 2015-07-22
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多