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

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 использовать websockets в качестве протокола в вашем mosquitto.conf:

listener $Broker-Port
protocol websockets

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .