подключите клиент mqtt.js к Mosca Broker через Nginx в Dockers (тот же Docker-compose) - PullRequest
0 голосов
/ 30 мая 2018

У меня есть:

  • 1 MongoDB
  • 2 Mqtt Mosca Brokers
  • 2 NodeJS Приложение как с mqtt.js cient
  • 1 ngnix

Балансировка нагрузки Nginx и proxy_pass для http и mqtt соответственно для приложений NodeJS и Mqtt Mosca Brokers,

, поэтому у меня есть:

mqtt Sensors ->nginx -> Mqtt Mosca Brokers «работает нормально»

Браузер -> nginx -> NodeJS Приложение «работает нормально»

Что я не могу сделать, это разрешить приложению NodeJS (Клиентская часть mqtt.js) подключается к Mqtt Mosca Brokers через nginx, что-то вроде:

NodeJS (клиент mqtt.js) -> nginx -> Mqtt Mosca Broker.

странная вещьчто если я попытаюсь:

NodeJS (клиент mqtt.js) -> Mqtt Mosca Broker, поток работает правильно

У меня есть следующая конфигурация:

docker-compose.yml

     nginx:
      build: ./nginx
      links:
        - app1:app1
        - app2:app2
        - mqttbroker1:mqttbroker1
        - mqttbroker2:mqttbroker2
      ports:
        - "80:80"
        - "443:443"
        - "1883:18833"
    app1:
      build: ./node_app
      links:
        - mongo:mongo
        - mqttbroker1:mqttbroker1
        - mqttbroker2:mqttbroker2
      ports:
        - "3000"
      environment:
        - NODE_ENV=production
        - PORT=3000
    app2:
      build: ./node_app
      links:
        - mongo:mongo
        - mqttbroker1:mqttbroker1
        - mqttbroker2:mqttbroker2
      ports:
        - "3000"
      environment:
        - NODE_ENV=production
        - PORT=3000    
    mqttbroker1:
      build: ./node_broker
      links:
        - mongo:mongo
      ports:
        - "18831"
      environment:
        - NODE_ENV=production
    mqttbroker2:
      build: ./node_broker
      links:
        - mongo:mongo
      ports:
        - "18831"
      environment:
       - NODE_ENV=production
    mongo:
     container_name: mongo
     restart: always
     image: mongo
     volumes:
       - ./mongo/data:/data/db
     ports:
       - "27017:27017"

nginx.conf (отрывок)

    stream {
      upstream mqtt_cluster{

        server mqttbroker1:18831 max_fails=3 fail_timeout=30s;
        server mqttbroker2:18831 max_fails=3 fail_timeout=30s;
      }

      server {
        listen 18833; #mqtt continer prot mapped on std port (1883:18833)
        proxy_pass mqtt_cluster;
      }
}

в основном, если в приложениях NodeJS я использую:

const mqttClient = mqtt.connect('mqtt://mqttbroker1:18831', { clientId: clientId });

это работает, но если я попробую:

const mqttClient = mqtt.connect('mqtt://nginx:18833', { clientId: clientId });

ничего не работает, кто-нибудь может помочь?

1 Ответ

0 голосов
/ 31 мая 2018

Я нашел решение, используя docker-compose.yml

вместо link Я использовал depen_on и сетей

файл YML:

version: '3'
services:
  nginx:
    build: ./nginx
    depends_on:
      - app1
      - app2
      - mqttbroker1
      - mqttbroker2
    ports:
      - "80:80"
      - "443:443"
      - "1883:1883"
    networks:
      main:
        aliases:
          - proxy
  app1:
    build: ./node_app
    depends_on:
      - mongo
      - mqttbroker1
      - mqttbroker2
    ports:
      - "3000"
    environment:
      - NODE_ENV=production
      - PORT=3000
    networks:
      main:
        aliases:
          - app1
  app2:
    build: ./node_app
    depends_on:
      - mongo
      - mqttbroker1
      - mqttbroker2
    ports:
      - "3000"
    environment:
      - NODE_ENV=production
      - PORT=3000
    networks:
      main:
        aliases:
          - app2
  mqttbroker1:
    build: ./node_broker
    depends_on:
      - mongo
    ports:
      - "18831"
    environment:
      - NODE_ENV=production
    networks:
      main:
        aliases:
          - mqttbroker1
  mqttbroker2:
    build: ./node_broker
    depends_on:
      - mongo
    ports:
      - "18831"
    environment:
      - NODE_ENV=production
    networks:
      main:
        aliases:
          - mqttbroker2
  mongo:
    container_name: mongo
    restart: always
    image: mongo
    volumes:
      - ./mongo/data:/data/db
    ports:
      - "27017:27017"
    networks:
      main:
        aliases:
          - mongo
networks:
  main:

, и я использую это для подключения через mqtt:

const mqttClient = mqtt.connect('mqtt://proxy', { clientId: clientId });
...