Москит + апач

Я пытаюсь получить 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
Другие вопросы по тегам