nginx - Docker jwilder/nginx-proxy 位置配置

标签 nginx docker docker-compose jwilder-nginx-proxy

我有 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/

相关文章:

ruby-on-rails - 如何删除nginx?

ruby-on-rails - 将 Rails 项目部署到远程服务器

docker - 尝试以非 root 用户身份从容器内部写入已安装的卷时出现问题

docker - 如何在主机服务器上将Zeppelin镜像与cassandra连接

docker - docker-compose 和手动命令之间的区别

windows - 如何使用 Windows 的绝对路径创建卷?

nginx - 使用 nginx 的 Vagrant 文件夹权限

debian 8.3 中 Nginx 安装错误

docker - 微服务,Docker和Node.js调试器

docker-compose - 如何让 crond 在 Docker 容器中自动启动 Alpine?