首页 > 解决方案 > 如何在docker上做反向代理

问题描述

我有一台服务器,我正在使用 Ubuntu 20.04、nginx、mosquitto 和 node-red 和 docker,我们称之为网站http://mywebsite.com。我面临的问题是我创建了一个客户端,可以在 docker 中将其称为 client1,因此 URL 将是http://mywebsite.com/client1 ,我想通过 mosquitto 建立 MQTT 连接,并且我正在发送有关主题的数据test

当我写我的 mosquitto 容器的 IP 地址时,在 MQTT 的节点红色节点上它工作的问题

在此处输入图像描述

但是,如果我使用 mywebsite.com/client1 更改 IP 地址 192.144.0.5,我将无法连接到 mosquitto,也无法发送或接收任何形式的数据

在此处输入图像描述

关于如何解决这个问题的任何想法

标签: dockerdocker-composenode-rednginx-reverse-proxymosquitto

解决方案


好的,您将在这里遇到几个问题。

  1. 您不能使用 MQTT 进行基于路径的代理。如果您想将多个 MQTT 代理(每个客户端 1 个)绑定到一个面向公众的域/IP 地址,那么它们都必须在单独的端口上运行(默认的 1883 除外)。

    Nginx 可以做 MQTT 协议代理(例如像这样),所以你可以使用它来暴露不同的端口并将它们转发到 mosquitto 的单独实例,但即使你有不同的主机名(都指向同一个 IP 地址)nginx无法知道使用了哪个主机名,因为没有等效的HOSTHTTP 标头来引导它。如果您将 MQTT 与 TLS 一起使用,那么您也许可以让它与 SNI 一起使用,但我从未见过有人这样做(此处可能是基于 SNI 的路由的文档)它有效,有关如何在此处执行此操作的说明.

    如果您在 Websockets 上使用 MQTT,那么您应该能够使用基于主机名的路由。

  2. 如果启用管理员身份验证,Node-RED 的基于路径的代理当前无法正常工作,因为管理员身份验证令牌当前存储在浏览器本地存储中,并且仅作用于主机名,而不是主机名 + 路径。这意味着客户端一次只能登录一个实例。

    您可以通过使用基于主机的代理来解决此问题,例如http://client1.mywebsite.com

    Node-RED 的积压工作对此进行了修复,可能(没有承诺)在 1.2.0 版发布后进行查看


推荐阅读