我有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可以本地化吗?
答案 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。