我有 3 个(app-client、app-a、app-b)应用程序在 jetty 服务器和一个 NGINX 负载均衡器(app-lb)中运行。所有(内部或外部)请求都通过负载均衡器到达我的应用程序。根据 Web 上下文(/app-a/或/app-b/)名称,LB 会将请求转发到正确的应用程序。我已在 LB 中配置(位置/app-a/和位置/app-b 和位置/app-client)。 app-a将调用app-b,app-b将调用app-a,app-client将从外部调用,app-client将调用app-a或app-b。
我已经为我的应用程序编写了 Docker-composer。为了避免循环依赖,我使用了 Docker net。运行良好。
如果我扩大我的应用程序。 LB 不知道这个新的应用程序容器。
我已经阅读了一些教程并尝试使用jwilder/nginx-proxy而不是NGINX。如果我使用 VIRTUAL_HOST=app-name 变量来使用它,它会在配置文件中更新上游。但是,我的应用程序是基于每个容器的位置映射运行的。如果我没有指定,请求将如何发送到正确的容器。
如何在 LB 的 default.conf 文件中提供位置映射,如下所示,因为此配置由容器动态更新或如何创建内部调用 URL。
location /app-a {
proxy_pass http://app-a;
}
location /app-client {
proxy_pass http://app-client;
}
location /app-b {
proxy_pass http://app-b;
}
Request from outside: http://IP:9090/app-client/
Internal call : http://app-lb:80/app-a/
http://app-lb:80/app-b
LB exposed port no is 9090
最佳答案
有拉取请求(e.g. #599)让 nginx-proxy 镜像支持虚拟路径。要实现这一点,您可以使用原始镜像并将您自己的 nginx.tmpl 文件传递到容器中(作为卷挂载,例如 -v $(pwd)/nginx.tmpl:/app/nginx.tmpl:ro
)。那么你的容器只需要定义 VIRTUAL_PATH
正如他们所愿 VIRTUAL_HOST
.
我还建议设置 DEFAULT_HOST
在 nginx-proxy 容器上,如果您不想要基于主机名的路由,请让每个人都指出这一点。
注意#599,我遇到的 nginx.tmpl 中有一个错误,你需要移动 {{ $networks := .Networks }}
在 {{ range $container := .Containers }}
之前增加两行(范围重新定义 .
,它重新定义 .Networks
)。否则,所有网络都将被假定为可访问,并且如果容器还连接到 nginx-proxy 无法访问的其他网络,您将遇到超时。
关于nginx - Docker jwilder/nginx-proxy 位置配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439172/