nginx代理多个节点的应用程序泊坞窗
我正在尝试nginx反向代理多个容器。
我有2个容器,有节点添加一个听8085和其他8086我希望他们访问
node.app1.com
node.app2.com
所以我用jwilder / nginx代理:最新将坐在这两个容器的来源,将作为反向代理。 所以这里是我的compose.yml文件。
泊坞窗,compose.yml
version: "3" services: node-proxy: build: ./node-proxy container_name : node-proxy restart : always volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - 80:80 - 443:443 node-app1: build: ./app1 container_name : node-app1 restart: always environment: VIRTUAL_HOST: node.app1.com depends_on: - node-proxy node-app2: build: ./app2 container_name : node-app2 restart: always environment: VIRTUAL_HOST: node.app2.com depends_on: - node-proxy
./node-proxy/Dockerfile
FROM jwilder/nginx-proxy:latest
./app1/app1.js
var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World 1\n'); }).listen(8085);
./app1/Dockerfile
FROM node:6.11 WORKDIR /app2 COPY app1.js . CMD node app1.js Expose 8085
./app2/app2.js
var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World 2\n'); }).listen(8086);
./app2/Dockerfile
FROM node:6.11 WORKDIR /app2 COPY app2.js . CMD node app2.js Expose 8086
所以当我这样做
docker-compose up
我所有的容器都在运行
但什么时候做node.app1.com – >它说的是未知的主机。
所以要检查它的请求来代理我尝试从浏览器调用http:// localhost它说503
我也检查nginx.config侧容器
docker exec -it node-proxy_id bash
cat /etc/nginx/conf.d/
它在那里,但我认为当我做node.app1.com请求不来代理。 我没有得到我错过的地方,有人能帮我解决这个问题。
谢谢你的时间
当您将links
或depends_on
设置为其他服务时,默认情况下, depends_on
-compose将在同一个泊坞窗networking中将其他服务主机名设置为其container_name
。
在你的情况下,我会build议添加@Mathias响应的links
。
version: "3" services: node-app1: build: ./app1 container_name : node-app1 restart: always expose: - "8085" environment: VIRTUAL_HOST: node.app1.com node-app2: build: ./app2 container_name : node-app2 restart: always expose: - "8086" environment: VIRTUAL_HOST: node.app2.com node-proxy: build: ./node-proxy container_name : node-proxy restart : always links: - node-app1 - node-app2 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro ports: - 80:80 - 443:443
更新:
我注意到Nginxconfiguration有upstream
指令来保存多个主机名。 你应该能够将node-app1
curl为:
$ curl -H 'Host: node.app1.com' localhost Hello World 1
您还可以修改node-proxy
容器中的etc/hosts
文件的最后一行,如下所示:
172.20.0.4 [docker-network-alias] node.app1.com node.app2.com
那么你应该可以直接在你的node-proxy
容器中访问http://node.app1.com
。
这里是一个在ubuntu 16 04上设置nginx虚拟主机的教程
评论I:
在我的理解中, nginx-proxy
倾向于将请求代理到后端服务,而不必在/etc/hosts
文件中注册主机名。 所以我们用Nginx upstream
模块中的虚拟主机名Host
标头来发起请求。
在每个应用程序容器设置中创build环境variablesVIRTUAL_HOST
时, nginx-proxy
已经为您完成了这一部分。 但这并不意味着我们可以直接访问我们浏览器中的node.app1.com
,并期望这个请求将被代理并由node-app1
容器响应。
返回请求转发部分,请求到达端口80/443的localhost
,由Nginx监听。 然后Nginx检查Host
头进入特定的位置块。 这就是为什么你不能在你的浏览器中直接访问http://node.app1.com ,因为这个主机名永远不会真的在etc/hosts
注册,所以它将永远不会被任何服务器,应用程序或者我们的nginx-proxy
。
如果我们想通过浏览器访问这个主机名,需要额外的etc/hosts
设置。
nginx-proxy
项目提供了一些模板设置,所以你可以获得应用程序容器的IP地址和VIRTUAL_HOST
环境,然后将其附加到/etc/hosts
文件。 但是通过这种方式,这将直接访问节点应用服务器,而不是来自nginx-proxy
。
如果没有生产级别的关注,我会build议在nginx-proxy
设置的最后一行的etc/hosts
文件中追加应用程序域名,那么它应该像你期望的那样工作。 否则,需要从nginx-proxy
模板进行主机名dynamic绑定的工作。
看看你的应用程序/ Dockerfile的端口:
./app1/app1.js
})听(8085);
和
./app1/Dockerfile
公开8086
他们是错配的。
我丢失的部分是jwilder/nginx-proxy
反映了jwilder/nginx-proxy
寻找需要被代理的容器。
原文:
我想你的问题是反向代理容器无法到达每个应用程序。 depends_on
从node-app1和node-app2中删除depends_on
并添加到node-proxy中:
links: - node-app1 - node-app2
反向代理需要启动两个应用程序,而不是相反。 也使用links
而不是depends_on
。
从文档 :
依赖于取决于
表示服务之间的依赖关系,这有两个作用:
docker-compose up将以依赖性顺序启动服务。 在下面的例子中,db和redis将在web之前启动。
docker-up up SERVICE将自动包含SERVICE的依赖关系。 在下面的例子中,docker-up up web也会创build并启动db和redis。
链接
链接服务的容器将可以在与别名相同的主机名上访问,如果没有指定别名,则可以访问服务名称。
链接也以与depends_on相同的方式表示服务之间的依赖关系,因此它们确定服务启动的顺序。
我也不知道你的代理configuration如何到达这个容器的IP地址。 您可以使用(如文档中所述)替代别名或服务名称。 (在你的情况下node-app1和node-app2)