我正在尝试通过Web套接字通过反向代理建立MQTT连接。是否可以配置Angular CLI代理以将请求转发到ws://localhost:4200/mqtt
到wss://mqtt.example.com/mqtt
?
我一直在尝试多个configurations,但似乎无法使其正常工作。这是我的proxy.conf.json
中的内容:
"/mqtt/*": {
"target": "wss://mqtt.example.com/",
"secure": false,
"ws": true,
"changeOrigin": true,
"logLevel": "debug"
}
我尝试了各种组合,使用secure
和/或changeOrigin
设置为true或false,但我无法连接。
使用"secure": false, "ws": true, "changeOrigin": true,
或"secure": true, "ws": true, "changeOrigin": true,
我总是得到:
WebSocket握手期间的错误:意外的响应代码:502
更新
我更改了代理定义以省略changeOrigin
选项,并将/mqtt
附加到目标:
"/mqtt": {
"target": "wss://mqtt.example.com/mqtt",
"secure": false,
"ws": true,
"logLevel": "debug"
},
现在得到不同的错误消息:
WebSocket握手期间的错误:意外的响应代码:404
我的问题是,我看不到Angular CLI正在发送到远程服务器的确切请求,我已经将logLevel
设置为debug
,但是没有提供任何有用的输出来诊断问题。如果我可以看到代理服务器对远程服务器发出的确切请求,调试它将非常有帮助。
更新2
绝对没有必要在目标中包含/mqtt
,因为这样我最终在代理提出的最终请求中以/mqtt/mqtt
结尾。
进一步调试,我在Kubernetes Ingress控制器中发现以下错误消息:
上游从上游读取响应标头时过早关闭连接,
但是,当我使用本地MQTT客户端(MqttBox)直接连接到安全Websocket时,该连接有效,因此我仍然认为上游配置不是问题,而是代理连接中引入了一些问题。
这是可能的;以下配置适用于eclipse test server:
"/wss": {
"target": "https://mqtt.eclipse.org:443/mqtt",
"secure": false,
"ws": true
},
note: https://mqtt.eclipse.org:443/mqtt
和wss://mqtt.eclipse.org:443/mqtt
都可以正常工作。
通过这种配置,我可以使用Paho JS MQTT Client进行连接(和订阅/发布等):
我不确定您的配置有什么问题,但怀疑"target": "wss://mqtt.example.com/"
应该为"target": "wss://mqtt.example.com/mqtt"
(但这可能仅是由于您如何匿名化数据?)。希望在测试服务器上进行尝试可以为您指明正确的方向(我假设您已经检查了代理是否可以在标准http
页面上使用。)>