【问题标题】:Azure WebSockets + NodeBB + Node.js ProxyAzure WebSockets + NodeBB + Node.js 代理
【发布时间】:2019-06-28 18:08:35
【问题描述】:

我在 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:origins nconf 中添加了 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 服务器通过 WebSocket 相互通信似乎存在问题。 Azure 本地运行良好。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我解决了这个问题,并想指出问题与 Azure 无关。


      但是,如果其他人正在阅读本文并在 Node.js 中使用 WebSockets,则必须在 webapp 配置中打开该选项,然后使用项目中的 web.config 文件禁用 iis WebSockets。

      【讨论】:

        猜你喜欢
        • 2013-02-10
        • 1970-01-01
        • 2014-07-04
        • 2012-03-25
        • 2015-04-10
        • 2013-05-04
        • 2011-03-28
        • 2011-08-09
        相关资源
        最近更新 更多