как сделать обратный прокси в docker

#docker #nginx #docker-compose #mqtt

#docker #docker-compose #узел-красный #nginx-reverse-proxy #mosquitto

Вопрос:

У меня есть сервер, и я использую Ubuntu 20.04, nginx, mosquitto и node-red и docker, давайте назовем веб-сайт http://mywebsite.com . Проблема, с которой я сталкиваюсь, заключается в том, что я создал клиент, позволяет называть его client1 в docker, поэтому URL-адрес будет http://mywebsite.com/client1 таким, и я хочу установить соединение MQTT через mosquitto, и я отправляю данные по теме test

Проблема в том, что на узле red node MQTT, когда я пишу IP-адрес моего контейнера mosquitto, он работает

введите описание изображения здесь

Но если я изменю IP-адрес 192.144.0.5 на mywebsite.com/client1 Я не могу подключиться к mosquitto и не могу отправлять или получать какие-либо данные

введите описание изображения здесь

есть идеи о том, как решить эту проблему

Ответ №1:

Хорошо, здесь у вас возникнет несколько проблем.

  1. Вы не можете выполнять проксирование на основе пути с помощью MQTT. Если вы хотите, чтобы несколько брокеров MQTT (по 1 на клиента) были привязаны к одному общедоступному домену / IP-адресу, тогда все они должны будут работать на отдельных портах (кроме 1883 по умолчанию).).

    Nginx может выполнять проксирование протокола MQTT (например, вот так), поэтому вы можете использовать это, чтобы открывать разные порты и пересылать их отдельным экземплярам mosquitto, но даже если у вас другое имя хоста (все указывают на один и тот же IP-адрес), nginx не может узнать, какое имя хоста использовалосьпотому что нет эквивалента HOST HTTP-заголовку для его направления. Если бы вы использовали MQTT с TLS, вы могли бы заставить его работать с SNI, но я никогда не видел, чтобы кто-нибудь это делал (возможные документы для маршрутизации на основе SNI здесь) Это работает, объяснение о том, как это сделать, здесь.

    Если вы используете MQTT через Websockets, вы должны иметь возможность использовать маршрутизацию на основе имени хоста.

  2. Проксирование на основе пути для Node-RED в настоящее время не работает должным образом, если вы включаете аутентификацию администратора, поскольку токены авторизации администратора в настоящее время хранятся в локальном хранилище браузера и ограничены только именем хоста, а не именем хоста путь. Это будет означать, что клиент сможет входить в систему только в одном экземпляре за раз.

    Вы можете обойти это, используя прокси на основе хоста, например http://client1.mywebsite.com

    Исправление для этого находится в бэклоге для Node-RED, вероятно (без обещаний), которое будет рассмотрено после отправки версии 1.2.0

Комментарии:

1. но я хочу, чтобы клиент регистрировался в одном экземпляре, чтобы у каждого клиента был свой мгновенный «брокер», где он мог отправлять или получать данные

2. Как я уже сказал, если у каждого клиента есть свой собственный брокер, им нужно будет работать на разных номерах портов, или вам нужно будет использовать MQTT через TLS с включенным SNI (я не уверен, поддерживает ли клиент NodeJS MQTT SNI, вам нужно будет проверить).

3. допустим, я буду использовать разные порты для каждого клиента, смогу ли я решить проблему так, чтобы для того, чтобы иметь 192.144.0.5, я бы mywebsite.com/client1 которые отправляют данные через, скажем, порт 60000

4. Никакие имена хостов не могут включать путь, который сопоставляет его с другим портом, вам нужно будет ввести либо имя хоста, либо IP-адрес, а затем вручную установить порт в другом поле.