需要哪些步骤才能使 ColdFusion websockets 在 Cloudflare 背后的 Azure VM 上运行?

What steps are required to make ColdFusion websockets work on an Azure VM behind Cloudflare?

我们正尝试在 Cloudflare 后面的 Azure VM 上 运行ning 的应用程序中使用 ColdFusion (2018.0.13.329786) 中的 websockets。但是,我们在客户端不断收到此错误:

WebSocket connection to 'wss://www.*************.com/cfws' failed: 
CFWebSocketWrapper.open @   cfwebsocketCore.js:21
init    @   cfwebsocketChannel.js:49
_cf_websockets_init_6539553945348401    @   strategies-for-devel…ing-with-impact:175
fire    @   cfajax.js:1214
$E.windowLoadHandler    @   cfajax.js:1321

Uncaught TypeError: Cannot set properties of undefined (setting 'readyState')
    at WebSocket.wsConnection.onerror (cfwebsocketCore.js:54:29)
wsConnection.onerror    @   cfwebsocketCore.js:54
error (async)       
CFWebSocketWrapper.open @   cfwebsocketCore.js:53
init    @   cfwebsocketChannel.js:49
_cf_websockets_init_6539553945348401    @   *************:175
fire    @   cfajax.js:1214
$E.windowLoadHandler    @   cfajax.js:1321
load (async)        
$E.onWindowLoad @   cfajax.js:1297
cfinit  @   cfajax.js:1332
(anonymous) @   cfajax.js:1834

我们有一个 cfc,当消息发布到写入服务器日志文件的通道时调用,并且此日志文件永远不会更新。这并不奇怪,因为似乎有什​​么东西完全阻止了连接。

从配置的角度来看,我们 运行 在创建 VM 时更新这些:

webSocketObj= createObject("component","cfide.adminapi.websocket");
webSocketObj.setProperty(propertyName="EnableWebSocketServer", propertyValue="true");
webSocketObj.setProperty(propertyName="EnableProxyPort", propertyValue="8581");

然后通过 cfExecute:

#server.coldfusion.rootdir#/lib/wsproxyconfig.jar -ws IIS -site All -host localhost -port 8581

然后重启CF服务和IIS。

我们还在 Cloudflare 中启用了 websocket 'switch'。

这应该与进入 CF Admin,进入 websockets 选项卡,然后勾选“使用代理”,然后使用默认端口 8581 相同。这应该通过 IIS 在端口 443 上从客户视角。

Cloudflare 和 Azure 表示不需要特殊配置。并且我们可以看到CF打开了8581端口

最令人气愤的是,我们去年在开发环境中进行了此工作,经过多次试验和错误后,它才开始工作。但是,我们当时的笔记并不好,当我们执行上述操作以尝试在我们的 QA 环境中运行它时,它并没有奏效。我们显然在某处遗漏了一步,但一直无法弄清楚。

任何已经完成此工作的人都可以解释使 ColdFusion websockets 在 Cloudflare 背后的 Azure VM 上工作需要哪些步骤吗?

我们解决了这个问题。希望这会帮助 运行 遇到同样问题的其他人:

根据这个 doc,我们意识到 wsproxyconfig 应该在 IIS 中创建一个名为 cfws 的 'application'(就像一个虚拟文件夹)指向 /config/wsproxy/1。然而,它并没有这样做。创建该应用程序后,一切都按预期开始工作。

经过进一步测试,我们发现它仅在 运行 作为管理员时才创建此应用程序。否则,它会报告成功并且不提供任何警告或失败,但不会创建应用程序。

我们通过 CFExecute 从命令行 运行ning wsproxyconfig,所以它是 运行ning 在管理用户下,但这显然是不够的。因此,我们将 wsproxyconfig 调用移至我们的一个 PowerShell 脚本,并使其 运行 具有管理权限,这解决了我们的问题。

这显然最初在我们的开发环境中有效,因为我们 运行 手动配置 wsproxy。