Fra*_*ain 5 proxy nginx docker docker-compose jwilder-nginx-proxy
我使用jwilder / nginx-proxy进行反向代理。我尝试重定向http://localhost:8000/api到特定的php服务。
目录结构:
.
+-- docker-compose.yml
+-- nginx
+-- nodejs
| +-- index.js
| +-- …
+-- php
| +-- api
Run Code Online (Sandbox Code Playgroud)
docker-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
Run Code Online (Sandbox Code Playgroud)
这对于nodejs服务来说很好用。
现在,我想将调用重定向http://localhost:8000/api到该php服务。我想我必须添加以下内容nginx conf:
server {
location /api {
proxy_pass http://php:80/api;
proxy_set_header Host $host;
}
}
Run Code Online (Sandbox Code Playgroud)
此功能未内置在lib中。那么,我该如何实现呢?
一种方法是为 php 应用程序提供自己的虚拟主机:
php:
image: php:apache
environment:
- VIRTUAL_HOST=api.localhost
volumes:
- ./php:/var/www/html
Run Code Online (Sandbox Code Playgroud)
然后,它将可以这样访问:
curl -H 'Host: api.localhost' http://localhost:8000/api
Run Code Online (Sandbox Code Playgroud)
设置标头实际上可以用任何语言来实现。或者为了避免设置自定义标头,您可以将该 DNS 添加到您的/etc/hosts文件中:
127.0.0.1 api.localhost
Run Code Online (Sandbox Code Playgroud)
所以你可以像这样卷曲:
curl -H http://api.localhost:8000/api
Run Code Online (Sandbox Code Playgroud)
这是设置自定义标头的方法,例如在节点中:
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)
}
)
Run Code Online (Sandbox Code Playgroud)
但是,我建议您采用 /etc/hosts 方法,该方法在生产环境中应该有等效的方法(DNS 服务器)。所以你不需要接触节点代码。
| 归档时间: |
|
| 查看次数: |
1946 次 |
| 最近记录: |