Москит + апач

1388
aliaksei

Я пытаюсь получить 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 содержатся в приведенных выше фрагментах, но удалены для целей этого вопроса). Ничего не отображается в журналах ошибок.

Я что-то упускаю? Может быть, есть лучший способ обойти это?

0

1 ответ на вопрос

1
Muto

Я наткнулся на ту же проблему, а также попытался использовать 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.

Чтобы проверить это, я использовал mqtt-spy от eclipse, который легче использовать для ручной публикации / подписки, чем для командной строки :)

PS: И не забудьте сказать Mosquitto использовать websockets в качестве протокола в вашем mosquitto.conf:

listener $Broker-Port protocol websockets 

Похожие вопросы