我使用jwilder / nginx-proxy来制作反向代理。 我尝试将http://localhost:8000/api
redirect到特定的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/api
到php
服务。 我想我必须添加到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服务器)中应具有相同的功能。 所以你不需要触摸节点代码。