我有以下设置:
- Docker Swarm 包含 1 个主服务器和 2 个从服务器。
- 管理群体的 Portainer 服务。
- 使用在主机上运行的 nginx 的 Web 应用程序。
我想使用 nginx 反向代理其余的 Swarm 服务以终止 ssl。
在 portainer 和 webapp 主页端口上使用反向代理时我取得了成功。
但是,我的用户可以启动一个“会话”,它将在(大)范围内的随机端口上运行,并可从x
主节点上的端口访问。
当我在其中一个端口上使用位置语句时,假设我们在 nginx 配置中(在配置中的正确位置)执行以下操作,它不起作用:
location /x {
proxy_pass http://127.0.0.1:x;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
为什么会这样呢?
答案1
我认为有更好的方法可以解决这个问题。使用 Traefik 反向代理(或类似服务)作为 Swarm 服务,并使用服务标签来定义哪些端口应路由到特定服务。这样,您需要发布的特定容器端口列表将通过 traefik 动态路由到它。Traefik 可以与 Docker/Swarm API 对话,并根据 Swarm 中发生的情况实时更新其代理规则。请参阅我的示例和视频https://github.com/BretFisher/dogvscat