enviado não conectado à VerneMQ para MQTT por meio de websockets, código de erro 503

Algumas informações rápidas para qualquer pessoa que se depare com os mesmos problemas, e como depurá-los.

Código de erro 503

Este é o código de erro que estou a receber:

imagem

Erro durante o aperto de mão do WebSocket: Código de resposta inesperado: 503.

Definir o registo do enviado para depuração

Aqui está o meu docker-compose.yaml para o enviado:

versão: '3.7'.

serviços:
   Enviado:
     construir:
       contexto: ./
       Arquivo de docas: Arquivo de doca
     container_name: penvoyage-morpheus-envoy
     portos:
       – “80:1080”
       – “443:1443”
     volumes:
       - tipo: volume
         fonte: penvoyage_volume
         alvo: /etc/envoy
     redes:
       - envoy_net
     usuário: “2000:2000”
     #user: "raiz:raiz"
     reinício: a não ser que seja parado
     ambiente:
       nível de registo: debug

volumes:
   penvoyage_volume:
     externo:
       nome: penvoyage_volume

redes:
   envoy_net:
     externo:
       nome: my-bridge-network

Mostrar os ouvintes do VerneMQ

no contentor VerneMQ, mostra os ouvintes e os IP's:

vmq-admin show de ouvintes

ip -4 addr show

imagem

Observe como o mqttws está vinculado a 172.21.0.2 no porto 8080.

Há dois IPs presentes no sistema:

  • 172.21.0.2
  • 172.18.0.7

isto deve-se ao facto de o contentor VerneMQ fazer parte de duas redes internas de estivadores.

Veja a saída do diário de bordo do enviado

Aqui estão alguns excertos para ilustrar um pedido de abertura de websocket do cliente MQTT:

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][http] [source/common/http/conn_manager_implpl.cc:210] [C85] novo fluxo

penvoyage-morpheus-envoy | ':autoridade', 'picockpit.local'.

penvoyage-morpheus-envoy | ':caminho', '/mqtt'.

penvoyage-morpheus-envoy | ':método', 'GET'.

penvoyage-morpheus-envoy | 'conexão', 'Upgrade'.

[C85][S100284757515705105266] combinação de cluster 'target_verne' para URL '/mqtt'.

[C85][S10028475751570510266] cabeçalhos decodificadores de roteador:

penvoyage-morpheus-envoy | ':autoridade', 'picockpit.local'.

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:82] criando uma nova conexão

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][client] [source/common/http/codec_client.cc:26] [C86] connecting

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][debug][connection] [source/common/network/connection_impl.cc:638] [C86] conectando a 172.18.0.7:8080

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][debug][connection] [source/common/network/connection_impl.cc:647] [C86] conexão em andamento

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/conn_pool_base.cc:20] pedido de enfileiramento devido à falta de ligações disponíveis

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][debug][connection] [source/common/network/connection_impl.cc:525] [C86] erro de conexão atrasada: 111
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][debug][connection] [source/common/network/connection_impl.cc:183] [C86] soquete de fechamento: 0
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][client] [source/common/http/codec_client.cc:82] [C86] disconnect. resetting 0 pending requests
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][pool] [source/common/http/http1/conn_pool.cc:123] [C86] cliente desconectado
penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][router] [source/common/router/router.cc:532] [C85][S10028475751570510510266] upstream reset

penvoyage-morpheus-envoy | [2019-05-19 11:14:33.024][22][debug][http] [source/common/http/conn_manager_implpl.cc:1234] [C85][S100284757515705105266] encoding headers via codec (end_stream=false):

penvoyage-morpheus-envoy | ':status', '503'

A razão para o erro 503

Neste caso, o motivo do erro 503 é que o enviado não consegue chegar à VerneMQ no IP 172.18.0.7 porta 8080 - VerneMQ está ouvindo no outro IP!

Portanto, o envoy retorna 503, que o servidor upstream não está disponível - e que esta condição pode ser corrigida quando o servidor upstream ficar disponível novamente.