Azure WebSockets + NodeBB + Node.js代理

时间:2019-06-26 14:33:44

标签: node.js azure websocket proxy azure-web-sites

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

一个Web应用程序正在运行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论坛时,可以看到WebSockets正确建立,并且在网站的本地版本和Azure托管的NodeBB论坛之间交换了消息。 / p>

但是,当网站位于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可以本地化吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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


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