docker - 如何在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,也无法发送或接收任何形式的数据
关于如何解决这个问题的任何想法
解决方案
好的,您将在这里遇到几个问题。
您不能使用 MQTT 进行基于路径的代理。如果您想将多个 MQTT 代理(每个客户端 1 个)绑定到一个面向公众的域/IP 地址,那么它们都必须在单独的端口上运行(默认的 1883 除外)。
Nginx 可以做 MQTT 协议代理(例如像这样),所以你可以使用它来暴露不同的端口并将它们转发到 mosquitto 的单独实例,但即使你有不同的主机名(都指向同一个 IP 地址)nginx无法知道使用了哪个主机名,因为没有等效的
HOST
HTTP 标头来引导它。如果您将 MQTT 与 TLS 一起使用,那么您也许可以让它与 SNI 一起使用,但我从未见过有人这样做(此处可能是基于 SNI 的路由的文档)它有效,有关如何在此处执行此操作的说明.如果您在 Websockets 上使用 MQTT,那么您应该能够使用基于主机名的路由。
如果启用管理员身份验证,Node-RED 的基于路径的代理当前无法正常工作,因为管理员身份验证令牌当前存储在浏览器本地存储中,并且仅作用于主机名,而不是主机名 + 路径。这意味着客户端一次只能登录一个实例。
您可以通过使用基于主机的代理来解决此问题,例如
http://client1.mywebsite.com
Node-RED 的积压工作对此进行了修复,可能(没有承诺)在 1.2.0 版发布后进行查看
推荐阅读
- derby - 使用 apache derby 时出现错误
- php - 如何将两个不同的数组合并到一个上
- powerbi - 为什么要为销售事实表创建产品维度?
- office-js - 阅读和撰写屏幕上的可固定任务窗格存在问题
- python - 如何将excel文件转换为文本文件
- python - 2 BoxLayout 中的 FloatLayouts 格式不正确
- css - 移动响应 - 投资组合自定义网格
- python - 如何在 Seaborn 中制作具有多个组或类别的联合图?
- java - 在 vscode 集成终端中使用替代的 maven 和 java 版本
- android - 为什么我不能在另一台 PC 上的 Androidstudio 上运行我的 android 应用程序?