2016-09-29 244 views
1

浏览器使用此连接到mosquitto(WebSockets的模式):如何通过服务器隧道浏览器端的mqtt?

new Paho.MQTT.Client('localhost', 9001, ''); 

据我了解,这是从浏览器到代理的直接连接。当浏览器位于不同的机器上时,它在正常设置下无法正常工作。

在正常的设置nodejs和代理在同一台机器上。如何通过nodejs路由该节点,以便nodejs可以将连接转发到localhost:9001?我不想编写大量代码来重新打包消息并重新实现不同的订阅API。

+0

有各种支持websocket代理的代理,像['node-http-proxy'](https://github.com/nodejitsu/node-http-proxy)或['rocky'] (https://github.com/h2non/rocky)。 – robertklep

回答

1

localhost是一种特殊情况的主机名,指的是某些代码正在运行的机器。

假设您要连接的代理位于承载网页的同一台计算机上,您可以使用location变量来获取所需的信息。

var client = new Paho.MQTT.Client(location.hostname, 9001, ''); 

假设你代理所述web应用程序则的WebSockets可以被代理以及在同一端口上,其将与结束了:

var client = new Paho.MQTT.Client(location.hostname, parseInt(location.port), ''); 

要代理的MQTT以及(使用nginx的):

location /mqtt { 
    proxy_pass   http://127.0.0.1:9001/; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 
+0

它不应该暴露在互联网上。我无法打开这个端口。 – Velkan

+0

那么你的应用程序如何访问?如果你有应用程序的nginx/apache代理,那么它可以代理Web代理到代理,并使用相同的端口(80?) – hardillb

+0

,这听起来像是一个正确的解决方案,但TLS部分将在浏览器中出现的位置 - 当我在nginx上启用它时? – Velkan

0

您可以打开另一个端口,然后设置一个SSH隧道(即SSH隧道MQTT数据)。这样做的好处是它可以让您轻松公开或不公开这个端口到互联网,并且它是安全的(加密的)。

本教程介绍了如何做到这一点。显然,由于MQTT数据通过SSH(通过SSH隧道)传输,因此它是100%加密的,因此是安全的。当然,你也可以使用RSA密钥(确实使SSH连接非常安全),然后编写一个简单的BASH脚本来实现所有这个过程的自动化。教程链接: SSH Tunnel MQTT

+1

但是,没有办法让Web浏览器通过SSH链接来隧道连接,所以这不太可能有用 – hardillb

相关问题