【问题标题】:Issue connecting to socket.io azure webapp连接到 socket.io azure webapp 的问题
【发布时间】:2020-04-06 22:47:51
【问题描述】:

我在 azure 上部署了一个 socket.io v0.9.17 节点 js 应用程序(我已经在本地使用两个客户端进行了测试,并且运行良好),代码如下:

var util = require("util");
var port = process.env.PORT || 1337;
var app = require("http").createServer(function (req, res) {
    res.writeHead(200, { "Content-Type": "text/plain" });
    res.end("Socket.io application");
}).listen(port);

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

io.configure(function () {
    io.set("transports", ["websocket"]);
});

io.sockets.on('connection', function (client) { ... }

我尝试通过 socket.io-java-client 连接到它:

// Have tested with different ports
socket.connect("http://myapp.azurewebsites.net:1337/", this);

这给我的客户端错误:

Error while handshaking... Operation timed out

登录服务器:

debug: websocket writing 1::
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
debug: cleared heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
debug: cleared heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
(repeated a couple of times)
...
IIS Detailed Error - 503.13 - Number of active WebSocket requests has reached the maximum concurrent WebSocket requests allowed.

socket.connect("http://myapp.azurewebsites.net/", this);

如果我连接一个客户端,这不应该发生。

任何想法如何解决这个问题?

编辑:试图从传输 websocket 更改为 xhr-polling。这不会给我 HTTP 503.13 错误并建立与服务器的连接,但效果不佳。

【问题讨论】:

    标签: node.js azure socket.io socket.io-java-client


    【解决方案1】:

    据我所知,如果要使用 websocket 功能,您需要在 Azure 门户上的 Application settings 选项卡中启用 Web sockets 选项,或者配置 web.config 文件以添加内容 <webSocket enabled="true" />

    作为参考,请参见下文。

    图 1. 在 Azure 门户上启用 Web sockets

    参考wiki页面Using a custom web.config for Node apps,默认禁用websocket功能。

    正如@ArneRie 所说,Azure webapps 仅侦听端口 80 和 443,请参阅https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#network-endpoint-listening

    关于不同层级每个应用服务实例的 websockets 限制,请参阅https://azure.microsoft.com/en-us/documentation/articles/azure-subscription-service-limits/#app-service-limits

    所以我认为第一步是确保启用 websocket 功能,然后尝试通过 socket.io-java-client 建立与 http 协议和端口 80 的 websocket 连接。

    希望对您有所帮助。有任何问题,请随时告诉我。

    【讨论】:

    • 我实际上已经完成了以上所有工作,并且我有标准计划。当我使用 process.env.PORT 时,端口似乎是 80,但我仍然收到 http 503.13 错误。
    • @codingIsFun 请参考blogNode.js Basic Chat Example 部分,并尝试为客户端使用https 协议。
    • 感谢您提到只有端口 80 和 443 是开放的
    【解决方案2】:

    Azure 始终映射到您的 Node.JS 应用程序的端口 80/443。

    var port = process.env.PORT || 1337;
    

    您的应用正在使用这段代码侦听端口 80/443。

    我不知道您正在运行哪种托管计划,但是当您拥有免费层时,连接非常有限(5 个?)。

    可能你在这个错误中运行,超时后 TCP 连接没有关闭:Node.js - Socket.io - Issue with "maximum concurrent connections"

    【讨论】:

    • 我有标准托管计划,所以它应该适用于一个客户。 80 给了我与其他端口相同的错误。 443 给了我异常连接重置。不过,这些似乎都不适用于本地。它说:警告 - 引发错误:错误:听 EACCES 0.0.0.0:443
    • 我也看过那个帖子,但是只有一个客户端连接时会发生错误,标准计划应该提供无限或 350 个并发连接。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多