您好我在这台服务器上安装了一台机器(服务器)和nginx(本机)。
我的域名 hotels.com(例如)
子域 api.hotels.com
这是机器上子域的conf文件(本机nginx):
server {
listen 80;
server_name api.hotels.com;
location / {
proxy_pass http://127.0.0.1:3000$request_uri;;
}
}
我使用微服务架构,2个服务构建我的应用程序: 用户 - 服务:3030,付款服务:3080
我想公开api.hotels.com/users/ AND api.hotels.com/payment
所以我选择在端口:3000上使用nginx(docker container)作为apiGateway,我想代理特定服务,所以使用此配置
server {
listen 3000;
location /users/ {
proxy_pass http://users:3030/;
}
location /payment/ {
proxy_pass http://users:3080/;
}
}
如果我试图获得http://api.hotels.com我从nginx(机器)获得nginx:好
但如果尝试获取http://api.hotels.com/users,则会将浏览器中的网址重写为http://127.0.0.1/users然后中断。
*注意:我使用docker-compose来提升这2个服务和nginx容器。
问题:
1)如何解决这个问题? 2)我的流程还可以,或者这个应用程序还有其他流程吗?
我的目的流示例:
1)客户http://api.hotels.com/users
2)服务器所有api.hotels.com ==> http://localhost:3000(api网关)
3)Nginx容器(端口:3000)==>按名称代理特定服务(本例中的用户)
答案 0 :(得分:1)
您的应用程序看起来不错,问题只是配置。 你可以试试这个配置:
server {
server_name api.hotels.com;
listen 80;
location /users/ {
proxy_pass http://users:3030/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host
}
location /payment/ {
proxy_pass http://users:3080/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host
}
}
在这种情况下你的nginx容器暴露ports =>的 INCOMING_PORT:80 强>
然后在你的例子中,它将在docker-compose.yml
中看起来像这样...
services:
api-gateway:
image: nginx:latest
ports:
- "3000:80"
...
以这种方式,您的api网关更加动态。您可以随时更改收入端口,容器内的nginx将侦听端口80,并将按名称代理特定服务。
祝你好运:)