【问题标题】:socket.io + azure app services 503 error even though websockets is ENABLED即使启用了 websockets,socket.io + azure app services 503 错误
【发布时间】:2020-05-08 17:59:46
【问题描述】:

我正在尝试在 Azure 应用服务上使用我的 Node.js 服务器设置 socket.io。它在我的本地服务器上运行良好。但是,我似乎无法让它在 Azure 上运行。

我在 Azure 应用服务 -> 配置 -> 常规设置中启用了 Web 套接字。但是,这不起作用。

我已按照此 stackoverflow 帖子中的说明进行操作:Socket IO net::ERR_CONNECTION_REFUSED,但它对我不起作用。

我的服务器端代码:

...
const port = process.env.PORT || 5000;
const app: Application = express();
const server = require("http").Server(app);
const io = require("socket.io")(server);
...
io.of("/chat").on("connection", async function(socket: any) {
  console.log('hi')
});
...
server.listen(port, () => console.log(`listening on port ${port} `));

我的 CORS 设置也已正确设置,对我的服务器的 HTTP 请求工作正常,以及需要凭据的请求。

任何帮助将不胜感激。谢谢

编辑(更多信息):

我正在使用内部身份验证。因此,我需要将标题“Access-Control-Allow-Credentials”设置为 TRUE。我的 express 应用程序通过 cors npm 模块将其设置为 true,但是无论我做什么,在执行身份验证请求时我都无法让 HTTP 请求工作。

我可以通过这样做来解决这个问题:

az resource update --name web --resource-group <myResourceGroupName> --namespace Microsoft.Web --resource-type config --parent sites/<site-name> --set properties.cors.supportCredentials=“true” --api-version 2015-06-01

我在这里找到的:(https://docs.microsoft.com/bs-latn-ba/azure/app-service/app-service-web-tutorial-rest-api)

这允许带有凭据的 HTTP 请求以及任何其他 HTTP 请求工作。请务必注意,在我的 Azure 设置中,我的所有 CORS 设置仍然是空白,以便让我的 express 应用程序处理 CORS。

不确定这是否相关......

EDIT2:

当我尝试从我的客户端连接时

    const socketIo = io(socketUrl + "/chat", {
      // transports: ["websocket"]
      upgrade: false,
    })

一切正常。但如果我取消注释transports: ["websocket"],连接将失败。一定和 Azure 中的 websocket 设置有关

【问题讨论】:

  • 您是否在监听应用服务名称:var socket = io('http://&lt;your app name&gt;.azurewebsites.net');?
  • 请尝试禁用 IIS WebSockets 支持模块 (iiswsock.dll),因为 node.js 不需要它。请参阅:azure.microsoft.com/en-in/blog/…(假设应用已部署到 Windows WebApp)
  • 感谢您的快速回复。 GauraKumar,它已被部署到 Linux Web App。它正在运行节点 12. 4c7436b41,我尝试连接 'http://.azurewebsites.net' 以及我自己的自定义域。没有任何工作:(
  • 感谢链接 4c74356b41。我尝试了他们在我的 express 应用程序中完全处理 CORS 的解决方案,但这也不起作用。另一种解决方案是在 Azure 应用服务中使用基于 Windows 的环境,但我无法选择该选项,因为 Node.js 不支持它。除非我运行一个我目前不想做的 docker 容器

标签: node.js azure websocket socket.io azure-web-app-service


【解决方案1】:

所以我做了一个准系统示例来测试套接字连接......它工作正常。

然后,我再次尝试了我的应用程序......它成功了。不知道发生了什么,但现在一切正常......

【讨论】:

    【解决方案2】:

    我建议您提供一个最小的工作示例(服务器和客户端页面),它会简化事情。

    这里有几件事要检查:

    • 在您的服务器端 Node.js 代码中禁用 perMessageDeflate

    例如这样:

    const io = require('socket.io')(server,{
       perMessageDeflate :false
    });
    
    • Azure Web Apps 仅侦听端口 80 和 443,这是一个常见问题

    这里看起来不像一个案例,但它经常发生,所以我将它留在这里以帮助其他人。根据the doc

    问:我可以在我的自定义容器映像上公开多个端口吗?

    答:我们不支持暴露多个端口。 因此,如果是这种情况 - 将端口更改为其中任何一个,您的应用都会正常运行。

    希望对你有帮助! ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多