用jwilder nginx-proxy,如何代理通过一个特定的容器的子目录url?

我使用jwilder / nginx-proxy来制作反向代理。 我尝试将http://localhost:8000/apiredirect到特定的php服务。

目录结构:

 . +-- docker-compose.yml +-- nginx +-- nodejs | +-- index.js | +-- … +-- php | +-- api 

泊坞窗,compose.yml:

 version: "3.1" services: nginx-proxy: image: jwilder/nginx-proxy:alpine ports: - "8000:80" volumes: - ./php:/srv/www - /var/run/docker.sock:/tmp/docker.sock:ro nodejs: image: node:alpine environment: - NODE_ENV=production - VIRTUAL_HOST=localhost - VIRTUAL_PORT=8080 expose: - "8080" working_dir: /home/app restart: always volumes: - ./nodejs:/home/app command: ["node", "index.js"] php: image: php:apache environment: - VIRTUAL_HOST=localhost volumes: - ./php:/var/www/html 

这对nodejs服务工作正常。

现在,我想将呼叫redirect到http://localhost:8000/apiphp服务。 我想我必须添加到nginx conf如下所示:

 server { location /api { proxy_pass http://php:80/api; proxy_set_header Host $host; } } 

这个特性不是内置在lib中的 。 那么,我该怎么做到呢?

一种方法是给php应用程序自己的虚拟主机:

  php: image: php:apache environment: - VIRTUAL_HOST=api.localhost volumes: - ./php:/var/www/html 

那么,这将是可以接受的:

 curl -H 'Host: api.localhost' http://localhost:8000/api 

设置标题可以用几乎任何语言来实现。 或者为了避免设置自定义标头,可以将该DNS添加到/etc/hosts文件中:

 127.0.0.1 api.localhost 

所以你可以这样卷曲:

 curl -H http://api.localhost:8000/api 

这是如何设置自定义标题,例如在节点中:

 var request = require('request') var formData = {} request({ headers: { 'Host': 'api.localhost' }, uri: 'http://localhost:8080', method: 'POST' }, function (err, res, body) { console.log("it works") console.log(res) } ) 

但是,我建议您采用/ etc / hosts方法,在生产环境(DNS服务器)中应具有相同的功能。 所以你不需要触摸节点代码。