Mosquitto + Apache

0

Estou tentando fazer com que o Apache 2.4.7 em um servidor Ubuntu 16.04 faça proxy e faça o proxy reverso de uma conexão com um broker Mosquitto MQTT local via WebSockets. libwebsockets está instalado e o Apache tem mod_proxy_wstunnel e mod_websocket_mosquitto disponível e ativado. Eu tenho tentado seguir este e < um href="https://blog.benjamin-cabe.com/2015/10/01/how-to-run-your-web-server-and-mqtt-websockets-broker-on-the-same-port" > isso , mas com pouca sorte.

O corretor Mosquitto está trabalhando localmente e eu posso publicar / sub-lo de um terminal SSH usando mosquitto_pub e mosquitto_sub usando as credenciais que eu criei, mas o TLS está desativado.

Eu tentei algumas maneiras de fazê-lo funcionar; Eu tentei fazer o Apache escutar em uma porta e configurar um vhost nessa porta para fazer proxy e reverter para a porta local primeiro usando mod_proxy_wstunnel (as 2 primeiras linhas comentadas) e então usando mod_websockets_mosquitto assim:

<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>

Sem sorte.

Eu tentei a mesma coisa, mas com um subdomínio e porta 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>

Mesma coisa.

Os logs de acesso mostram uma solicitação GET usando o último método e nada ao usar a primeira (as diretivas de log estão nos snippets acima, mas removidos para o propósito desta pergunta). Nada é exibido nos registros de erros.

Existe algo que me falta? Talvez haja uma maneira melhor de contornar isso?

    
por aliaksei 17.06.2017 / 15:33

1 resposta

1

Eu tropecei no mesmo problema e também tentei usar mod_websocket_mosquitto para fazer isso funcionar, mas sem sucesso.

O que funcionou para mim foi usar proxy_wstunnel diretamente (seguindo este pequeno artigo - eu não encontrar os problemas mencionados no artigo, eles devem ser corrigidos por agora):

Primeiro eu disse ao apache para escutar na porta 1883 para aceitar as requisições mqtt (o arquivo de configuração padrão para isso é ports.conf ). É claro que você pode escolher basicamente qualquer porta, desde que seu cliente saiba onde se conectar.

Listen 1883

Em seguida, configuro um VirtualHost simples para fazer proxy de solicitações de entrada:

<VirtualHost *:1883>

        ProxyRequests Off

        ProxyPreserveHost On

        ProxyPass /mqtt ws://$Broker-IP:$Broker-Port
        ProxyPassReverse /mqtt ws://$Broker-IP:$Broker-Port
</VirtualHost>

Esta configuração irá provavelmente precisar de algumas tweeks, mas permitiu-me ligar ao meu corretor usando o IP do meu apache.

Para testar isso, eu usei o mqtt-spy do eclipse, que é um pouco mais fácil de usar para publicação manual / subscrevendo que a linha de comando:)

PS: E lembre-se de dizer ao mosquitto para usar websockets como protocolo no seu mosquitto.conf :

listener $Broker-Port
protocol websockets
    
por 11.10.2017 / 16:10