我正在尝试在 Ubuntu 16.04 服务器上安装 Apache 2.4.7,以便通过 WebSockets 代理和反向代理与本地 Mosquitto MQTT 代理的连接。libwebsockets
已安装,并且 Apache 已安装mod_proxy_wstunnel
并mod_websocket_mosquitto
并已启用。我一直在尝试关注这和这,但运气不佳。
Mosquitto 代理在本地工作,我可以使用我创建的凭据从 SSH 终端发布/订阅它,但 TLS 已禁用mosquitto_pub
。mosquitto_sub
我尝试了几种方法让它工作;我试图让 Apache 监听一个端口并在该端口上设置一个 vhost 来代理并反向到本地端口,首先使用mod_proxy_wstunnel
(前 2 行注释),然后使用mod_websockets_mosquitto
如下方法:
<virtualhost *:1888>
#ProxyPass / ws://127.0.0.1:1884 keepalive=on retry=360
#ProxyPassReverse / ws://127.0.0.1:1884 keepalive=on
<IfModule mod_websocket.c>
#Loadmodule mod_websocket_mosquitto /usr/lib/apache2/modules/mod_websocket_mosquitto.so
<Location />
MosBroker localhost
MosPort 1884
SetHandler websocket-handler
WebSocketHandler /usr/lib/apache2/modules/mod_websocket_mosquitto.so mosquitto_init
</Location>
</IfModule>
</virtualhost>
那里没运气。
然后我尝试了同样的事情,但使用子域和端口 80:
<virtualhost *:80>
ServerName sub.domain.com
ServerAdmin [email protected]
DocumentRoot "/var/www/public_html/subdomain"
#ProxyPass / ws://127.0.0.1:1884 keepalive=on retry=360
#ProxyPassReverse / ws://127.0.0.1:1884 keepalive=on
<IfModule mod_websocket.c>
#Loadmodule mod_websocket_mosquitto /usr/lib/apache2/modules/mod_websocket_mosquitto.so
<Location /mqtt>
MosBroker localhost
MosPort 1884
SetHandler websocket-handler
WebSocketHandler /usr/lib/apache2/modules/mod_websocket_mosquitto.so mosquitto_init
</Location>
</IfModule>
</virtualhost>
一样。
使用后一种方法时,访问日志会显示 GET 请求,而使用前一种方法时则不会显示任何内容(日志指令在上面的代码片段中,但为了回答这个问题而删除了)。错误日志中不会显示任何内容。
我是不是遗漏了什么?也许有更好的方法可以解决这个问题?
答案1
我偶然发现了同样的问题并尝试使用 mod_websocket_mosquitto 来使其工作,但没有成功。
对我有用的是直接使用 proxy_wstunnel (以下这篇短文- 我没有遇到文章中提到的问题,现在应该已经修复了):
首先我告诉 apache 监听端口 1883 以接受 mqtt 请求(此端口的默认配置文件是ports.conf
)。当然,您基本上可以选择任何端口,只要您的客户端知道要连接到哪里即可。
Listen 1883
然后我设置了一个简单的 VirtualHost 来代理传入的请求:
<VirtualHost *:1883>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /mqtt ws://$Broker-IP:$Broker-Port
ProxyPassReverse /mqtt ws://$Broker-IP:$Broker-Port
</VirtualHost>
这个配置可能需要一些调整,但它允许我使用我的 apache 的 IP 连接到我的代理。
为了测试这一点,我使用了 eclipse 的mqtt-间谍与命令行相比,它更易于手动发布/订阅:)
PS:请记住告诉 mosquitto 使用 websockets 作为协议mosquitto.conf
:
listener $Broker-Port
protocol websockets