【问题标题】:how to do reverse proxy on docker如何在docker上做反向代理
【发布时间】:2020-10-13 15:23:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: docker docker-compose node-red nginx-reverse-proxy mosquitto


    【解决方案1】:

    好的,你会遇到几个问题。

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

      Nginx 可以做 MQTT 协议代理(例如 this),因此您可以使用它来公开不同的端口并将它们转发到 mosquitto 的单独实例,但即使您有不同的主机名(都指向相同的 IP 地址)nginx 无法知道使用了哪个主机名,因为没有等效于 HOST 的 HTTP 标头来指导它。如果您将 MQTT 与 TLS 一起使用,那么您也许可以让它与 SNI 一起使用,但我从未见过有人这样做(基于 SNI 的路由的可能文档here工作,解释如何做到这一点here

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

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

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

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

    【讨论】:

    • 但我希望客户端登录一个实例,以便每个客户端都有他的即时“经纪人”,他可以在其中发送或接收数据
    • 正如我所说,如果每个客户端都有自己的代理,他们将需要在不同的端口号上运行,或者您需要在启用 SNI 的情况下使用 MQTT over TLS(我不确定 NodeJS 是否MQTT 客户端支持 SNI,您必须检查)。
    • 假设我将为每个客户端使用不同的端口,我是否能够解决问题,以便拥有 192.144.0.5 我将拥有发送数据的 mywebsite.com/client1 让sayi端口 60000
    • 没有主机名不能包含将其映射到不同端口的路径,您需要输入主机名或 IP 地址,然后在另一个框中手动设置端口。
    猜你喜欢
    • 2020-09-03
    • 2016-07-22
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多