Москит + апач
Я пытаюсь получить Apache 2.4.7 на сервере Ubuntu 16.04 для прокси и обратного прокси-соединения с локальным брокером Mosquitto MQTT через WebSockets. libwebsockets
установлен и Apache имеет mod_proxy_wstunnel
а также mod_websocket_mosquitto
доступно и включено. Я пытался следовать этому и этому, но без особой удачи.
Брокер Mosquitto работает локально, и я могу опубликовать его на терминале SSH, используя mosquitto_pub
а также mosquitto_sub
используя учетные данные, которые я создал, но TLS отключен.
Я попробовал несколько способов заставить это работать; Я попытался заставить 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 some@guy.com
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 с использованием последнего метода и ничего при использовании первого (директивы Log приведены в приведенных выше фрагментах, но удалены для целей этого вопроса). Ничего не отображается в журналах ошибок.
Я что-то упускаю? Может быть, есть лучший способ обойти это?
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>
Вероятно, для этой конфигурации понадобятся некоторые настройки, но это позволило мне подключиться к моему брокеру, используя IP-адрес моего apache.
Чтобы проверить это, я использовал eclipse mqtt-spy, который проще использовать для ручной публикации / подписки, чем для командной строки:)
PS: И не забудьте сказать Mosquitto использовать веб-сокеты в качестве протокола в вашем mosquitto.conf
:
listener $Broker-Port
protocol websockets