首页 > 解决方案 > Azure WebSockets + NodeBB + Node.js 代理

问题描述

我在 Azure(Linux 服务器)上运行了 2 个 Web 应用程序。

一个 webapp 正在运行 NodeBB (v1.12.1) - https://my-forum.azurewebsites.net

不应直接访问此应用程序,而是将其代理到 Azure 上运行的第二个 Web 应用程序。

NodeBB 配置设置为“url”为“ https://my-website.azurewebsites.net/forums/

我在socket.io:originsnconf 中添加了 URL,以便能够从其他 URL 发出 WebSocket 请求。这些值如下所示: http://my-website.azurewebsites.net:* https://my-website.azurewebsites.net:* https://my-forum.azurewebsites.net:* https://localhost:*


主网站 ( https://my-website.azurewebsites.net ) 是一个 Node.js & Express 应用程序,其中包含一些前端路由、api 路由并使用该http-proxy-middleware模块将请求代理到论坛。它的设置和配置如下所示:

...

const proxy = require('http-proxy-middleware');
const forumProxy = proxy({
    target: process.env.FORUM_URL,
    changeOrigin: true,
    ws: true,
    secure: true,
    xfwd: true,
    logLevel: 'debug'
});
app.use('/forums', forumProxy);

const mainserver = http.createServer(app);
... other config
mainserver.on('upgrade', forumProxy.upgrade);

当我在本地运行主网站 ( https://localhost:3000 ) 并代理 NodeBB 论坛时,我可以看到 WebSocket 已正确建立,并且在网站的本地版本和 Azure 托管的 NodeBB 论坛之间交换了消息。

但是,当网站在 Azure 上时,它的代理 URL 和站点非常好,但 WebSocket 连接不起作用。主网站发送“2probe”消息,但从未建立连接,也不会交换消息。

直接访问论坛 URL 可以按预期工作,包括正在交换的 WebSocket 消息。


主网站和论坛都有一个 web.config,其中包含:

<system.webServer>
    <webSocket enabled="false"/>
</system.webServer>

这两个应用程序还在服务器上设置了 --web-sockets-enabled=true 值(通过 PowerShell 设置)。

据我了解,这会在服务器上启用 WebSocket,并且 web.config 中的“false”值是关闭 iis WebSockets 并让 Node.js 处理它。


2 个 Azure 服务器通过 WebSockets 相互通信似乎存在问题。Azure 本地工作正常。

为什么“ https://my-website.azurewebsites.net ”无法建立到“ https://my-forum.azurewebsites.net ”的WebSocket?但是本地到 Azure 可以吗?

标签: node.jsazurewebsocketproxyazure-web-app-service

解决方案


Azure WebApps 在称为沙盒的安全环境中运行。通过 Internet 访问应用程序的唯一方法是通过已经公开的 HTTP (80) 和 HTTPS (443) TCP 端口;应用程序可能不会在其他端口上侦听来自 Internet 的数据包。但是,应用程序可能会创建一个套接字,该套接字可以侦听沙箱内的连接。例如,同一应用程序中的两个进程可能通过 TCP 套接字相互通信;从沙盒外部传入的连接尝试,即使它们在同一台机器上,也会失败。

与本地地址(例如 localhost、127.0.0.1)和机器自身 IP 的连接尝试将失败,除非同一沙箱中的另一个进程在目标端口上创建了侦听套接字。


推荐阅读