node.js - 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: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 服务器通过 WebSockets 相互通信似乎存在问题。Azure 本地工作正常。
为什么“ https://my-website.azurewebsites.net ”无法建立到“ https://my-forum.azurewebsites.net ”的WebSocket?但是本地到 Azure 可以吗?
解决方案
Azure WebApps 在称为沙盒的安全环境中运行。通过 Internet 访问应用程序的唯一方法是通过已经公开的 HTTP (80) 和 HTTPS (443) TCP 端口;应用程序可能不会在其他端口上侦听来自 Internet 的数据包。但是,应用程序可能会创建一个套接字,该套接字可以侦听沙箱内的连接。例如,同一应用程序中的两个进程可能通过 TCP 套接字相互通信;从沙盒外部传入的连接尝试,即使它们在同一台机器上,也会失败。
与本地地址(例如 localhost、127.0.0.1)和机器自身 IP 的连接尝试将失败,除非同一沙箱中的另一个进程在目标端口上创建了侦听套接字。
推荐阅读
- javascript - 尝试替换旧数组时使用无效数据调用 DocumentReference.update()
- shell - 以 sh 启动时 Zsh 不执行大括号扩展?
- tensorflow - Keras:如何在每个时期更改随机数?
- python - 带有 python 的 Tika 服务器对大文件返回 None,但适用于小 pdf 的文件
- java - 如何从java中的另一个类访问对象?
- php - 使用客户满意度按优先级排序票证
- c# - API 控制器动态过滤 ASP .NET Core 和 EF Core 中的返回字段
- python - Python中字符串中的每个项目到列表中的项目
- amazon-web-services - 如何将使用 CSR 生成的私钥转换为 PEM 格式?
- python - python中的原始数字数据管理